通过com从Python调用Excel宏/Excel解算器

通过com从Python调用Excel宏/Excel解算器,python,excel,com,win32com,solver,Python,Excel,Com,Win32com,Solver,我在2007 xlsm文件中有一个宏,当调用该宏时,它会创建解算器配置(目标、约束等),并在没有任何用户交互的情况下执行解算。当从Excel手动运行时,这可以正常工作 现在,我想通过com从Python编写脚本。但是,当Python代码调用solver宏时: app.Run("runSolver()") 它失败于: foobar.xlsm无法解决,错误消息:模型中有错误。请 验证所有单元格和约束是否有效 如果我在调用Run()时在Python环境中设置一个断点,然后从Excel手动运行宏,它工

我在2007 xlsm文件中有一个宏,当调用该宏时,它会创建解算器配置(目标、约束等),并在没有任何用户交互的情况下执行解算。当从Excel手动运行时,这可以正常工作

现在,我想通过com从Python编写脚本。但是,当Python代码调用solver宏时:

app.Run("runSolver()")
它失败于:

foobar.xlsm无法解决,错误消息:模型中有错误。请 验证所有单元格和约束是否有效

如果我在调用
Run()
时在Python环境中设置一个断点,然后从Excel手动运行宏,它工作正常,因此解算器配置不会出错

错误消息已列出,但我认为它不适用,因为工作表手动解决得很好

通过com调用时,解算器环境尚未设置。但是,

Application.Run "Solver.xla!Solver.Solver2.Auto_open"
由于“我的解算器”宏的第一行导致更通用的:

  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)
那么,正确的做法是什么呢


编辑:

我将其隔离为一个可复制的测试用例:

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文件:(您可以在禁用宏的情况下打开它,并在
模块1
中检查简单子模块,以验证其安全性)。

在发布到上之后,我终于找到了解决方案。这个解决方案极其琐碎:

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

app.Run("runsolver()")
显然,您必须放下括号,像这样运行它:

app.Run("runsolver")
算了吧