1

这可能是我在这里问过的最愚蠢的问题,但很难找到这样的问题的答案。

我有一个带有一堆模块/子程序的程序,每个模块/子程序计算一个不同的变量。它们非常复杂,所以我喜欢将它们分开。现在我想要一个较早的模块根据用户输入跳到另一个模块。我以为我可以为此使用该call (sub name)方法,但随后程序返回到调用行所在的位置,并从中断处继续该模块。

例子:

模块一:

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 后返回到完整的模块 1,我该怎么做才能将控制切换到模块 2?

我觉得我只是使用了最令人困惑的语言来解释所有这些,但无论如何感谢您的帮助!

编辑:我知道我可以互换使用模块和子这两个词,而且我知道它们是不同的。我喜欢将每个子(在我的程序中都非常大)保留在自己的模块中,因为这样更容易跟踪它们,并且更容易向其他人解释/演示应用程序流程。

4

3 回答 3

2

我认为您正在寻找的只是Exit Sub使程序离开子程序而不再继续的命令,但是您通常想要这样做的方式是,而不是调用 a Sub,而是调用 aFunction返回布尔值。

因此,例如:

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

它只是增加了更多的灵活性和选择是否要继续在您的潜艇中进一步的能力。

希望这是有道理的。

于 2013-06-10T16:08:50.360 回答
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

为什么我说应该避免这种方法,通过 MSDN

"注意 End 语句会突然停止代码执行,而不调用 Unload、QueryUnload 或 Terminate 事件或任何其他 Visual Basic 代码。您放置在窗体和类模块的 Unload、QueryUnload 和 Terminate 事件中的代码不会执行。从类模块创建的对象被销毁,使用 Open 语句打开的文件被关闭,程序使用的内存被释放。其他程序持有的对象引用无效。

End 语句提供了一种强制程序停止的方法。对于 Visual Basic 程序的正常终止,您应该卸载所有窗体。只要没有其他程序持有对从您的公共类模块创建的对象的引用并且没有代码执行,您的程序就会关闭。”

于 2013-06-10T18:13:27.983 回答
0

它总是会返回,但这并不意味着它是一个问题。我建议您使用 Exit Sub,如下所示:

子 NewPracticeSub()

Call otherpracticesub

**Exit Sub**
'Nothing more can execute here so its no longer a worry

结束子

模块 2:

子其他实践sub()

MsgBox ("We're in the other practice sub!")

结束子

于 2016-05-11T03:06:27.207 回答