从Python over COM调用Excelmacros/ Excel解算器
我有一个2007年的xlsm文件里面有一个macros,当被调用时,创build一个解算器configuration(目标,约束,…),并执行解决scheme,没有任何用户交互。 从Excel手动运行时,这工作正常。
我现在想从Python通过COM脚本。 但是,当Python代码调用求解器macros时:
app.Run("runSolver()")
它失败:
foobar.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")
去搞清楚。