Excel VBA-使用GoSub而不返回

时间:2018-10-08 15:11:46

标签: excel vba

在某些情况下,我想在子例程中使用GoSub,并且在某些情况下,返回,但是在其他情况下,我会使用它。对于For Loop和GoSub,在没有Return的情况下,这可能会发生数百次。如果我不退货,这会在内存中堆积并引起任何问题吗?

我想我的问题可以归结为:GoSub是否堆叠?足够大的未归还GoSub的堆栈会引起问题吗?

如果堆栈,则可以在不想返回的实例中更改代码以使用GoTo,但为简单起见,我宁愿不使用它。

也要先感谢您没有就GoTo / GoSub并不是最佳实践向我讲课:)

2 个答案:

答案 0 :(得分:2)

很多人说:不要这样做。我30年来一直从事编程工作(谋生),除了在编程语言不提供任何子例程的情况下可以替代GoSub / Return,所以从来不需要使用GoSub / Return。

那就是-我很好奇VBA如何处理这个问题。第一件事:我假设必须有某种堆栈。一个例程中可以包含多个GoSub / Return,并且可以正确处理它:

Sub testSub1()
    Call StrangeRoutine1
End Sub

Sub StrangeRoutine1()

    GoSub L1
    Exit Sub

L1:
    Debug.Print "Strange1 - L1a"
    GoSub L2
    Debug.Print "Strange1 - L1b"
    Return

L2:
    Debug.Print "Strange1 - L2a"
    Return
End Sub

此打印:

Strange1 - L1a
Strange1 - L2a
Strange1 - L1b

因此return语句在正确的GoSub之后跳转-可以肯定地使用某种堆栈来处理。

但是,似乎在离开子例程后就清除了该堆栈。以下例程具有GoSub,但没有Return。因此,它在“堆栈”上留下了一个开放的GoSub。但是,当第二次调用它并发出一个Return而没有一个GoSub时,它会抛出一个运行时错误3“没有GoSub的返回。

Dim count As Long

Sub testSub2()
    For count = 1 To 2
        Call StrangeRoutine2
    Next
End Sub


Sub StrangeRoutine2()
    If count > 1 Then Return
    GoSub L1
    Exit Sub

L1:
    Debug.Print "Strange2 - L1"
End Sub

P.S .:我是否提到过:不要这样做!

答案 1 :(得分:1)

在VBE中查看堆栈的快捷方式是 Ctrl + E 。如您所见,它不会堆叠:

enter image description here

Sub GosubDemo()

    GoSub MyRoutine
    Debug.Print "Line before Exiting"
    Exit Sub

GoSomeWhereElso:
    Debug.Print "SomewhereElso I am "
    Return

MyRoutine:
    Debug.Print "My routine"
    GoSub GoSomeWhereElso
    Return

End Sub

但是,请勿在VBA中使用GoSubGoTo。这被认为是非常不好的做法。 GoTo可以像On Error GoTo ErrorHandler一样用于错误处理。