私は、呼び出されたときにソルバー設定(ターゲット、制約など)を作成し、ユーザーの操作なしに解を実行する2007 xlsmファイル内にマクロを持っています。 Excelから手動で実行すると、正常に動作します。Excelマクロ/ ExcelソルバーをPythonからcom経由で呼び出す
これを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
の単純なサブを調べて安全かどうか確認してください)。