Используйте VBA, чтобы остановить решатель, обновляющий строку состояния - PullRequest
0 голосов
/ 17 января 2019

Я выполняю большой процесс оптимизации, где я хотел бы проверить статус. Оптимизация основана примерно на решающем цикле. Я вставил, где это в настоящее время в коде, используя строку состояния. Однако решатель перехватывает строку состояния, поэтому я не вижу свое текущее обновление строки состояния. Мысли о том, как подавить захват решателя в строке состояния?

1 Ответ

0 голосов
/ 17 января 2019

Вы не можете сделать это, по крайней мере, без серьезного взлома Win32 - например, перехвата цикла сообщений Windows и перехвата сообщений, которые обновляют строку состояния ... которые обычно не очень хорошо заканчиваются, с нарушением доступа сбои и другие вещи, с которыми вы действительно не хотите иметь дело в VBA.

Что вы можете сделать, так это сообщить о прогрессе, не касаясь строки состояния.

Вы можете сделать это с помощью ProgressIndicator модальной UserForm (я написал эту статью в прошлом году).

Суть в том, что вы превращаете свой макрос в "диспетчер":

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
...