Завершение макроса в вызываемой подпрограмме

У меня есть макрос (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
Другие вопросы по тегам