在某些情况下,我想在子例程中使用GoSub,并且在某些情况下,返回,但是在其他情况下,我会不使用它。对于For Loop和GoSub,在没有Return的情况下,这可能会发生数百次。如果我不退货,这会在内存中堆积并引起任何问题吗?
我想我的问题可以归结为:GoSub是否堆叠?足够大的未归还GoSub的堆栈会引起问题吗?
如果是堆栈,则可以在不想返回的实例中更改代码以使用GoTo,但为简单起见,我宁愿不使用它。
也要先感谢您没有就GoTo / GoSub并不是最佳实践向我讲课:)
答案 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 。如您所见,它不会堆叠:
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中使用GoSub
或GoTo
。这被认为是非常不好的做法。 GoTo
可以像On Error GoTo ErrorHandler
一样用于错误处理。