Приветствую! Возникла необходимость правильно обработать нажатие Esc (сработает при DoEvents) во время работы макроса, а именно: 1. Как обнаружить нажатие и/или появление диалогового окна отладки как на скрине 2. Как не дать этому окну появиться или скрыть его 3. Как продолжить работу макроса после "отмены", как, если бы пользователь нажал Continue в окне отладки (чтобы дать макросу отменить совершённые действия, включить отключённой и так далее, неважно что)
Чтобы окно появилось, нужно во время работы макроса (несколько секунд) нажать Esc
Option Base 1
Option Explicit
Option Private Module
'====================================================================================================
Sub Test()
Dim t!, r&, n&
n = 1000000
Columns(1).ClearContents
Application.EnableCancelKey = xlErrorHandler
On Error GoTo er
t = Timer
For r = 1 To n
If Not PRDX_StatusBar(r, n, , True) Then MsgBox "Cancel Process", vbCritical, "Cancel": GoTo fin
If Err Then GoTo fin
Cells(r, 1).Value2 = 1
Next r
MsgBox "Done", vbInformation, Format$(Timer - t, "#,##0 sec"): GoTo fin
er: MsgBox "«Esc»-button cancel processing!", vbCritical, "TEST"
Columns(1).ClearContents
fin: Application.StatusBar = False
Application.EnableCancelKey = xlInterrupt
End Sub
'====================================================================================================
Function PRDX_StatusBar(ByVal sCur#, ByVal sTotal#, Optional ByVal Msg$ = "Progress: ", Optional MsgEsc As Boolean) As Boolean
Dim procCur#, ASU As Boolean
Static sPrev#
procCur = Round(sCur / sTotal, 1)
If sPrev = procCur Then PRDX_StatusBar = True: Exit Function
ASU = Application.ScreenUpdating: Application.ScreenUpdating = True
sPrev = procCur: Application.StatusBar = Msg & Format$(procCur, "0%")
On Error GoTo er: DoEvents: On Error GoTo 0
PRDX_StatusBar = True: Application.ScreenUpdating = ASU: Exit Function
er: If MsgEsc Then MsgBox "«Esc»-button cancel processing!", vbCritical, "StatusBar"
End Function
'====================================================================================================
Опытным путём было установлено, что в самой функции перехватить дебаговое окно нельзя (или я что-то не так делал), зато можно перехватить в основной процедуре и правильно его обработать
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
В частности, при значении xlErrorHandler при нажатии пользователем Ctrl+Break возникнет ошибочная ситуация с кодом ошибки 18, которую можно обработать в макросе по On Error.
UPD: sokol92: при значении xlErrorHandler при нажатии пользователем ESC возникнет ошибочная ситуация с кодом ошибки 18, которую можно обработать в макросе по On Error
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Для остановки работы макроса нужно нажимать Ctrl+Break (поправил).
Код
Sub Mymacro()
Application.EnableCancelKey = xlErrorHandler
On Error GoTo ErrLabel
' бесконечный цикл
While True
Range("A1") = Now
Application.Wait Now + TimeValue("0:00:01")
DoEvents
Wend
ErrLabel:
If Err.Number = 18 Then
If MsgBox("Вы действительно хотите прервать работу макроса MyMacro", vbYesNo + vbQuestion) = vbYes Then
Exit Sub
Else
Resume Next
End If
Else
MsgBox "Ошибка при выполнении макроса MyMacro:" & Err.Description, vbCritical
End If
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
RAN, в отдельной теме лучше обсудить - к моей отношения не имеет Я думаю, что хватит программы для переназначения на уровне винды и/или SendKeys
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄