我在2007 xlsm文件中創建了一個宏,它在調用時會創建一個求解器配置(目標,約束......)並執行求解而無需任何用戶交互。從Excel手動運行時,這工作正常。從com上調用Excel宏/ Excel求解器
我現在想通過Python編寫腳本來通過com。然而,當Python代碼調用求解器宏:
app.Run("runSolver()")
它失敗:
foobar.xlsm未能解決,錯誤信息:錯誤的模型。請 驗證所有單元格和約束條件均有效。
如果我在調用Run()
時在我的Python環境中設置了一個斷點,然後從Excel手動運行宏,它可以正常工作,因此解算器配置不會錯誤。
錯誤消息列出on the solver website但我不認爲它適用,因爲工作表手動解決罰款。
This page suggests解決方案環境在通過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
中的簡單子項以驗證其安全性)。