3

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

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

app.Run("runSolver()")

它失败了:

foob​​ar.xlsm 无法解决,错误信息:模型错误。请验证所有单元格和约束条件是否有效。

如果我在调用时在我的 Python 环境中设置断点,Run()然后从 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 文件:http ://dl.dropbox.com/u/3142953/testsolver.xlsm (您可以在禁用宏的情况下打开它并检查简单的子组件module1以验证它是否安全)。

4

1 回答 1

4

在MSDN Excel Developers 论坛上发帖后,我终于找到了解决方案。解决方案非常简单:

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

app.Run("runsolver()")

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

app.Run("runsolver")

去搞清楚。

于 2011-07-21T11:40:55.470 回答