0

次のコードを使用して、xlwings モジュールから VBA で RunPython を呼び出しています。

Sub Portfolio_Optimze()
RunPython ("import quotes; quotes.get_quote()")
SolverAdd CellRef:="$H$18:$H$24", Relation:=1, FormulaText:="$J$18:$J$24"
SolverAdd CellRef:="$B$15:$G$15", Relation:=4
SolverOk SetCell:="$H$16", MaxMinVal:=1, ValueOf:=0, ByChange:="$B$15:$G$15", _
    Engine:=1, EngineDesc:=" GRG Nonlinear "
SolverSolve

RunPython コードが完全に終了するまで SolverAdd コードを待機させるにはどうすればよいですか?

4

3 に答える 3

2

まずはじめに、Excel on Mac では、Excel がアイドル状態のとき、つまりマクロが実行されていないときにのみ、外部プロセスによるセルへの書き込みが許可されます。そのため、RunPythonMac での呼び出しはバックグラウンド プロセスとして実行され、呼び出しマクロの実行が終了したときにのみ実際に開始されます。

次の2つの解決策のいずれかをお勧めします。

1) ソルバー部分も Python でプログラムします。たとえば、 を使用しscipy.optimizeます。

2) ソルバー VBA を独自の Sub に配置し、Python から呼び出します。これは現在、xlwings の次のバージョンで計画されている機能です。ここを参照しwbてください。

app = xlwings.Application(wkb=wb)
app.xl_app.run_VB_macro('SolverMacro')

UPDATE、v0.7.1以降、これは適切にサポートされるようになりました:

>>> solver_macro = wb.macro('SolverMacro')
>>> solver_macro()
于 2015-06-19T07:58:21.593 に答える
1

もう 1 つの方法は、Python コードの最後にある隠しシートの値を変更し、Worksheet_Change一部の vba コードを起動するスニペットを使用することです。非表示のシートが「補足」の場合、Python コードの最後に次のようなものを追加します。

Range('Supplement', 'A1').value = Range('Supplement', 'A1').value +1

また、「補足」シートの vba は次のようになります。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
        Worksheets("Main1").Range("A1").WrapText = True
    End If
End Sub

Application.EnableEventsする必要があることを覚えておいてください= True

于 2015-09-12T18:07:10.420 に答える
0

少しぎこちないかもしれませんがApplication.OnTime、設定した時間にコードを実行するようにスケジュールできるメソッドも見てください。したがって、ソルバー コードを別の proc に配置し、呼び出しRunPythonてから、ソルバー proc をたとえば 10 秒間スケジュールします。

または、おそらくより良い答えは、Pythonコードを取得して、Range完了時にまたはテキストファイルに書き込むことです。ソルバー コードを含む proc は、範囲またはファイルを調べて、python が完了したかどうかを確認します。Python が終了していない場合は、N 秒後に再度実行するようにスケジュールし、それ以外の場合はソルバーを実行します。

于 2015-06-19T07:08:32.860 に答える