在被调用的子例程中结束宏

时间:2013-09-13 18:05:09

标签: vba excel-vba nested routines excel

我有一个宏(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也会继续运行。有没有办法结束这个sub,还有一个叫它的那个?

2 个答案:

答案 0 :(得分:8)

End

注意End完全停止代码执行(在当前调用堆栈中,因此它不会影响其他项目,如Addins等(一件好事))但它将关闭所有打开的文件句柄(一件好事)。另一方面,静态和模块级变量(如果你使用它们)将丢失它们的值,并且不会运行类终止方法,所以如果你有一个'app'而不是宏,这可能是不希望的。 / p>

这听起来像是为了你的目的,这可能是最简单的方法。

一个愚蠢的例子:

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

答案 1 :(得分:5)

如果用户按下取消,则在顶部声明一个布尔变量并将其设置为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