如何在完成后不返回第一个模块而调用另一个模块?
这可能是我在这里问过的最愚蠢的问题,但很难find这样的答案。
我有一个程序与一堆模块/潜艇每个计算一个不同的variables。 他们很复杂,所以我喜欢把他们分开。 现在我想让一个早期的模块根据用户input跳到另一个模块。 我以为我可以使用call (sub name)
方法,但是然后程序返回到呼叫线路的地方,并继续在该模块从中断的地方。
例:
模块1:
Sub NewPracticeSub() Call otherpracticesub MsgBox ("We've gone back to this sub... :(") End Sub
模块2:
Sub otherpracticesub() MsgBox ("We're in the other practice sub!") End Sub
我不希望它返回到模块1.我能做些什么来让模块2切换到没有模块的模块2,然后在完成模块2之后返回到模块1?
我觉得我只是用最容易混淆的语言来解释所有这些,但感谢您的帮助!
编辑:我知道我使用的单词模块和子可互换,我知道他们是不同的。 我喜欢将每个子程序(在程序中都是非常大的)保存在自己的模块中,因为跟踪它们更容易,并且更容易向其他人解释/演示应用程序stream。
除了使用我将在下面描述的丑陋的End
语句(并强烈build议您避免)之外,我不知道有什么办法来绕过调用堆栈。 即使约翰的回应必然返回到调用过程,并评估另一个陈述,以确定是否进行或结束。
这可能会产生不希望的结果,这就是为什么我毫不犹豫地推荐它,赞成恰当地构build您的代码,循环等方面的调用堆栈。
在任何情况下,您都可以在子例程中使用End
语句,而不需要任何公共/全局variables。 这仍然允许您灵活地决定何时以及在哪里调用End
语句,所以不需要总是调用它。
Sub NewPracticeSub() Call otherpracticesub, True MsgBox ("We've gone back to this sub... :(") End Sub Sub otherpracticesub(Optional endAll as Boolean=False) MsgBox ("We're in the other practice sub!") If endAll then End '## Only invoke End when True is passed to this subroutine End Sub
为什么我说这个方法应该避免 ,通过MSDN:
“注意End语句会突然停止代码执行,而不会调用Unload,QueryUnload或Terminate事件或任何其他Visual Basic代码。已放置在窗体和类模块的Unload,QueryUnload和Terminate事件中的代码不会执行。从类模块创build的对象被销毁,使用Open语句打开的文件被closures,程序使用的内存被释放,其他程序所持有的对象引用被无效化。
End语句提供了一种强制程序停止的方法。 对于Visual Basic程序的正常终止,您应该卸载所有窗体。 只要没有其他程序持有引用从公共类模块创build的对象并且没有执行代码,程序就会closures。
我想所有你正在寻找的命令是Exit Sub
,这将使程序离开子程序没有继续下去,但是你通常想要这样做的方式是,而不是调用一个Sub
,而是调用一个Function
返回一个布尔值。
所以,例如:
Public Function MyFunc() as Boolean .... If [good] MyFunc = True Else MyFunc = False End Function
那么你可以做一些事情:
Sub MyCallingSub() ... If MyFunc = True then Exit Sub Else ... End Sub
它只是增加了更多的灵活性和能力,以select是否要继续进一步在你的分。
希望是有道理的。
它会一直回来,但这并不意味着它是一个问题。 我build议你使用Exit Sub如下:
Sub NewPracticeSub()
Call otherpracticesub **Exit Sub** 'Nothing more can execute here so its no longer a worry
结束小组
模块2:
Sub otherpracticesub()
MsgBox ("We're in the other practice sub!")
结束小组