Завершение макроса в вызываемой подпрограмме
У меня есть макрос (CMOV), который вызывает другую подпрограмму (CMOV2), которая проверяет условие, которое, если выполнено, отображает окно сообщения vbokaycancel, которое я устанавливаю равным переменной с именем irep,
Я хочу, чтобы, если кто-то нажал "Отмена" (irep=2), чтобы он отозвал весь макрос. Это не только выход из CMOV2, но и выход из CMOV.
В настоящее время у меня есть
If jackal(1) <> vbNullString Then
irep = MsgBox("Warning: You have a selection with two swingarms" _
& " that are on the same radius and cannot swing past one another " _
& Chr$(13) & " Choose Okay if you still wish to proceed otherwise " _
& " choose Cancel to revise your order" & Chr$(13) & " " _
& jackal(1) & Chr$(13) & " " & jackal(2), vbOKCancel)
**If irep = 2 Then
Exit Sub**
Else: End If
Else: End If
End Sub
в конце подпрограммы. Проблема в том, что, хотя это выходит из CMOV2, CMOV продолжает работать. Есть ли способ закончить этот саб, и тот, который назвал его?
2 ответа
End
Обратите внимание, что End полностью останавливает выполнение кода (в текущем стеке вызовов, поэтому он не влияет на другие проекты, такие как Addins и т. Д. (Это хорошо)), но закрывает все дескрипторы открытых файлов (что хорошо). С другой стороны, статические переменные и переменные уровня модуля (если вы их используете) потеряют свои значения, и методы завершения класса не будут запускаться, поэтому, если у вас больше "приложения", чем макроса, это может быть нежелательно.
Похоже, для ваших целей это нормально и, вероятно, самый простой способ сделать это.
Глупый пример:
Sub foo()
Dim i As Long
For i = 0 To 10
If i = 2 Then
Debug.Print "hooray"
End
Else
Debug.Print "hip"
End If
Next i
End Sub
Объявите логическую переменную вверху и установите для нее значение True
если пользователь нажимает кнопку отмены. Вот пример.
Dim ExitAll As Boolean
Sub CMOV()
'
'~~> Rest of the code
'
ExitAll = False
CMOV2
If ExitAll = True Then Exit Sub
MsgBox "Hello World"
'
'~~> Rest of the code
'
End Sub
Sub CMOV2()
'
'~~> Rest of the code
'
If jackal(1) <> vbNullString Then
irep = MsgBox("Some Message", vbOKCancel)
If irep = 2 Then
ExitAll = True
Exit Sub
End If
End If
'
'~~> Rest of the code
'
End Sub