从Python over COM调用Excelmacros/ Excel解算器

我有一个2007年的xlsm文件里面有一个macros,当被调用时,创build一个解算器configuration(目标,约束,…),并执行解决scheme,没有任何用户交互。 从Excel手动运行时,这工作正常。

我现在想从Python通过COM脚本。 但是,当Python代码调用求解器macros时:

app.Run("runSolver()") 

它失败:

foob​​ar.xlsm未能解决,错误消息:模型中的错误。 请validation所有单元格和约束条件是否有效。

如果我在调用Run()在Python环境中设置了一个断点,然后从Excel手动运行这个macros,它可以正常工作,所以求解器的configuration不会出错。

错误消息列在解算器网站上,但我不认为它适用,因为表单解决手动罚款。

这个页面表明当通过com调用时,求解器环境还没有build立。 但是,添加

 Application.Run "Solver.xla!Solver.Solver2.Auto_open" 

正如我解算器macros的第一行结果是更一般的:

  File "c:\python26\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x6.py", line 35061, in Run , Arg26, Arg27, Arg28, Arg29, Arg30 File "c:\python26\lib\site-packages\win32com\client\__init__.py", line 456, in _ApplyTypes_ self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None) 

那么,正确的做法是什么?


编辑:

我把它分解成一个可复制的testing用例:

Python代码:

 from win32com.client import Dispatch if __name__ == '__main__': app = Dispatch("Excel.Application") app.Visible = True app.Workbooks.Open(r'C:\path\to\testsolver.xlsm') app.Run("runsolver()") 

Excel文件: http : //dl.dropbox.com/u/3142953/testsolver.xlsm (你可以打开它的macros禁用,并检查module1的简单的子,以确保它是安全的)。

在MSDN Excel Developers论坛上发布后,我终于find了解决scheme。 而解决scheme是琐碎的小事:

而不是像这样运行求解器:

 app.Run("runsolver()") 

你显然必须删除括号并像这样运行它:

 app.Run("runsolver") 

去搞清楚。