2011-07-18 21 views
3

私は、呼び出されたときにソルバー設定(ターゲット、制約など)を作成し、ユーザーの操作なしに解を実行する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の単純なサブを調べて安全かどうか確認してください)。

答えて

4

最後にMSDN Excel Developers forumに投稿した後に解決策が見つかりました。その溶液はmaddingly些細だった:代わりにそうようにソルバーを実行しているの

app.Run("runsolver") 

囲碁フィギュア:

app.Run("runsolver()") 

あなたは明らかにブラケットをドロップすると、そのようにそれを実行する必要があります。

関連する問題