使用VBA停止求解器更新状态栏

时间:2019-01-17 18:40:17

标签: excel vba statusbar solver

我正在运行一个大型的优化过程,我想检查状态。该优化大致基于求解器循环。我使用状态栏插入了当前代码中的位置。但是,求解器会劫持状态栏,因此我看不到当前状态栏的更新。关于如何抑制求解器劫持状态栏的思考?

1 个答案:

答案 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