我正在运行一个大型的优化过程,我想检查状态。该优化大致基于求解器循环。我使用状态栏插入了当前代码中的位置。但是,求解器会劫持状态栏,因此我看不到当前状态栏的更新。关于如何抑制求解器劫持状态栏的思考?
答案 0 :(得分:3)
您不能这样做,至少不能没有严重的Win32黑客攻击-例如,劫持Windows消息循环并拦截更新状态栏的消息...通常情况下,由于访问冲突而无法很好地结束崩溃以及您实际上不想在VBA中处理的所有事情。
您可以执行的操作是在不触摸状态栏的情况下报告进度。
您可以使用ProgressIndicator模态用户窗体(我去年写过这篇文章)来做到这一点。
问题的关键在于您将宏转换为“调度程序”:
Public Sub MyMacro()
With ProgressIndicator.Create("DoSolverWork", canCancel:=True)
.Execute
End With
End Sub
现在DoSolverWork
可能看起来像这样:
Public Sub DoSolverWork(ByVal progress As ProgressIndicator)
Const steps As Long = 10000
Dim i As Long
For i = 1 To steps ' whatever your loop does
If ShouldCancel(progress) Then
'here more complex worker code could rollback & cleanup
Exit Sub
End If
' do work here
progress.Update i / steps
Next
End Sub
Private Function ShouldCancel(ByVal progress As ProgressIndicator) As Boolean
If progress.IsCancelRequested Then
If MsgBox("Cancel this operation?", vbYesNo) = vbYes Then
ShouldCancel = True
Else
progress.AbortCancellation
End If
End If
End Function