Вы не можете сделать это, по крайней мере, без серьезного взлома 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