2011-07-18 62 views
3

我在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中的簡單子項以驗證其安全性)。

回答

4

我在MSDN Excel Developers forum上發佈後終於找到了解決方案。並將該溶液maddingly瑣碎:

相反的運行,像這樣的求解:

app.Run("runsolver()") 

你顯然需要刪除括號,並像這樣運行:

app.Run("runsolver") 

進入數字。