如何等待xlwings在vba中完成python代码?

如何等待xlwings在vba中完成python代码?,python,excel,vba,xlwings,Python,Excel,Vba,Xlwings,我使用以下代码从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$1

我使用以下代码从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

如何使SolverAdd代码等待RunPython代码完全完成

可能有点笨重,但也可以看看
Application.OnTime
方法,它允许您计划代码在设定的时间运行。因此,将您的解算器代码放入另一个进程,调用
RunPython
,然后安排解算器进程,比如说,10秒的时间


或者,可能更好的答案是,让python代码在完成后写入
范围或文本文件。带解算器的proc代码将查看范围或文件,以查看python是否完成。如果python没有完成,那么它会安排自己在N秒内再次运行,否则会运行解算器。

可能有点笨重,但也可以看看Application.OnTime
方法,它允许您安排代码在设定的时间运行。因此,将您的解算器代码放入另一个进程,调用
RunPython
,然后安排解算器进程,比如说,10秒的时间


或者,可能更好的答案是,让python代码在完成后写入
范围或文本文件。带解算器的proc代码将查看范围或文件,以查看python是否完成。如果python没有完成,那么它会安排自己在N秒内再次运行,否则会运行解算器。

可能有点笨重,但也可以看看Application.OnTime
方法,它允许您安排代码在设定的时间运行。因此,将您的解算器代码放入另一个进程,调用
RunPython
,然后安排解算器进程,比如说,10秒的时间


或者,可能更好的答案是,让python代码在完成后写入
范围或文本文件。带解算器的proc代码将查看范围或文件,以查看python是否完成。如果python没有完成,那么它会安排自己在N秒内再次运行,否则会运行解算器。

可能有点笨重,但也可以看看Application.OnTime
方法,它允许您安排代码在设定的时间运行。因此,将您的解算器代码放入另一个进程,调用
RunPython
,然后安排解算器进程,比如说,10秒的时间


或者,可能更好的答案是,让python代码在完成后写入
范围或文本文件。带解算器的proc代码将查看范围或文件,以查看python是否完成。如果python未完成,则计划在N秒内再次运行,否则将运行解算器。

一些信息开始:Mac上的Excel仅允许外部进程在Excel空闲时(即没有宏运行时)写入单元格。这就是为什么Mac上的
RunPython
调用作为后台进程运行,只有在调用宏完成运行时才会真正启动

我建议采用以下两种解决方案之一:

1) 还可以用Python编程求解器部分,例如使用
scipy.optimize

2) 将解算器VBA放入它自己的子对象中,并从Python调用它。这是当前xlwings下一版本的计划功能,请参阅,但您现在可以这样做(假设
wb
是您的工作簿):

更新,自v0.7.1版起,现在已正确支持:

>>> solver_macro = wb.macro('SolverMacro')
>>> solver_macro()

首先介绍一些信息:Mac上的Excel仅允许外部进程在Excel空闲时(即没有宏运行时)写入单元格。这就是为什么Mac上的
RunPython
调用作为后台进程运行,只有在调用宏完成运行时才会真正启动

我建议采用以下两种解决方案之一:

1) 还可以用Python编程求解器部分,例如使用
scipy.optimize

2) 将解算器VBA放入它自己的子对象中,并从Python调用它。这是当前xlwings下一版本的计划功能,请参阅,但您现在可以这样做(假设
wb
是您的工作簿):

更新,自v0.7.1版起,现在已正确支持:

>>> solver_macro = wb.macro('SolverMacro')
>>> solver_macro()

首先介绍一些信息:Mac上的Excel仅允许外部进程在Excel空闲时(即没有宏运行时)写入单元格。这就是为什么Mac上的
RunPython
调用作为后台进程运行,只有在调用宏完成运行时才会真正启动

我建议采用以下两种解决方案之一:

1) 还可以用Python编程求解器部分,例如使用
scipy.optimize

2) 将解算器VBA放入它自己的子对象中,并从Python调用它。这是当前xlwings下一版本的计划功能,请参阅,但您现在可以这样做(假设
wb
是您的工作簿):

更新,自v0.7.1版起,现在已正确支持:

>>> solver_macro = wb.macro('SolverMacro')
>>> solver_macro()

首先介绍一些信息:Mac上的Excel仅允许外部进程在Excel空闲时(即没有宏运行时)写入单元格。这就是为什么Mac上的
RunPython
调用作为后台进程运行,只有在调用宏完成运行时才会真正启动

我建议采用以下两种解决方案之一:

1) 还可以用Python编程求解器部分,例如使用
scipy.optimize

2) 将解算器VBA放入它自己的子对象中,并从Python调用它。这是当前xlwings下一版本的计划功能,请参阅,但您现在可以这样做(假设
wb
是您的工作簿):

更新,自v0.7.1版起,现在已正确支持:

>>> solver_macro = wb.macro('SolverMacro')
>>> solver_macro()

另一种方法是在python代码末尾的隐藏工作表中更改一个值,并使用
工作表\u change
代码段触发一些vba代码。如果隐藏的工作表是“补充”,那么在python代码末尾添加如下内容:

范围('Supplement','A1')。值=范围('Supplement','A1')。值+1

“补充”表中的vba可以是:

专用子工作表_变更(ByV)