嵌套宏:范围:如何退出所有?

时间:2013-06-03 11:44:54

标签: vba

我目前有2个宏:

在第一个宏中调用第二个宏来执行任务。但是我在第二个宏中有逻辑,表明我的变量 LastRow< 3 然后退出子。这当然会让我们立即回到宏1.我想要的是然后立即退出宏1 。我尝试这样做的方法是在两个宏中公开LastRow ..所以当我们退回到宏1时,我们有:

sub macro1()
application.run("macro2")
    if LastRow < 3 then
    exit sub
end sub

其中宏2()

sub macro1()

    Static LastRow As Long

        if LastRow < 3 then
        exit sub
else do something
end if
    end sub

我相信我的问题可能是静态没有给宏变量LastRow的宏1访问权限。

最好的方法是什么?

问候!

3 个答案:

答案 0 :(得分:7)

您可以这样使用End statement

sub macro2()

    Static LastRow As Long

    if LastRow < 3 then
        '...here is End
        End
    else 
        'do something
    end if
end sub

但是,End有一些你应该注意的缺点。让我以MSDN为基础引用它们:

  

立即终止执行。从来没有要求,但可能是   放置在程序中的任何位置以结束代码执行,关闭文件   用Open语句打开并清除变量。

     

执行时,End语句重置所有模块级变量和   所有模块中的所有静态局部变量。保持价值   这些变量,请改用Stop语句。然后你可以恢复   执行时保留这些变量的值。

     

End语句提供了一种强制程序停止的方法。对于   正常终止Visual Basic程序,你应该卸载所有   形式。一旦没有其他程序,您的程序就会关闭   保存对从公共类模块创建的对象的引用   并且没有代码执行。

答案 1 :(得分:1)

您可以使用Function而不是Sub,例如返回一个布尔值。

Function macro2() As Boolean
'returns false if the last row is 2 or less, true otherwise

    LastRow As Long

    if LastRow >= 3 then
        macro2 = True
        'do something
    end if
End Function

然后在你的第一个宏中:

sub macro1()
    if Not macro2 Then Exit Sub
end sub

答案 2 :(得分:0)

在第一个宏中声明变量并将其ByRef传递给第二个宏。

Sub Mac1()

    Dim lLastRow As Long

    Mac2 lLastRow

    If Not IsTooBig(lLastRow) Then
        'do stuff
    End If

End Sub

Sub Mac2(ByRef lLastRow As Long)

    lLastRow = 5

    If IsTooBig(lLastRow) Then
        Exit Sub
    End If

End Sub

Function IsTooBig(ByVal lLastRow As Long) As Boolean

    IsTooBig = lLastRow >= 5

End Function

ByRef意味着您在Mac2中对lLastRow所做的任何更改都将反映在Mac1中的lLastRow中。