这可能是我曾经问过的最愚蠢的问题,但是很难找到像这样的事情的答案。
我有一个带有一堆模块/子程序的程序,每个程序都计算一个不同的变量。它们非常复杂,所以我喜欢将它们分开。现在我想要一个更早的模块根据用户输入跳转到另一个模块。我以为我可以使用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后返回完成模块1?
我觉得我只是使用最混乱的语言解释所有这些,但谢谢你的帮助!
编辑:我知道我使用了单词module和sub可以互换,我知道它们是不同的。我喜欢将每个sub(在我的程序中都是非常大的)保存在自己的模块中,因为它更容易跟踪它们,并且更容易向其他人解释/演示应用程序流。
答案 0 :(得分:2)
我认为你所寻找的只是命令Exit Sub
,这将使程序离开子程序而不再继续下去,但你通常想要这样做的方式是,而不是调用{{1而是调用一个返回布尔值的Sub
。
所以,例如:
Function
然后你可以按照以下方式做点什么:
Public Function MyFunc() as Boolean
....
If [good] MyFunc = True
Else MyFunc = False
End Function
它只是增加了更多的灵活性和能力来选择是否要继续你的潜水艇。
希望这是有道理的。
答案 1 :(得分:1)
除了使用我将在下面描述的丑陋End
语句(并强烈建议您避免)之外,我不知道有任何方法可以绕过调用堆栈。甚至John的响应也必然返回到调用过程,并评估另一个语句以确定是继续还是结束。
这可能会产生不良结果,这就是为什么我会犹豫推荐它,支持正确构建与调用堆栈相关的代码,循环等。
在任何情况下,以下是如何在子子例程中使用End
语句,而不需要任何类型的公共/全局变量。这仍然允许您灵活地决定何时&在哪里调用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
为什么我说this method should be avoided , via MSDN:
“注意End语句突然停止代码执行,没有 调用Unload,QueryUnload或Terminate事件或任何其他事件 Visual Basic代码。您放入Unload,QueryUnload的代码, 并且不执行表单和类模块的终止事件。 从类模块创建的对象被销毁,文件打开使用 Open语句关闭,程序使用的内存是 释放。其他程序持有的对象引用无效。
End语句提供了一种强制程序停止的方法。对于 正常终止Visual Basic程序,你应该卸载所有 形式。一旦没有其他程序,您的程序就会关闭 保存对从公共类模块创建的对象的引用 并且没有代码执行。“
答案 2 :(得分:0)
它将永远返回,但这并不意味着它是一个问题。我建议您按如下方式使用Exit Sub:
Sub NewPracticeSub()
composer install
End Sub
第2单元:
Sub otherpracticesub()
vendor
End Sub