如何在完成后不返回第一个模块而调用另一个模块?

这可能是我在这里问过的最愚蠢的问题,但很难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!") 

结束小组