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

时间:2013-06-10 16:03:20

标签: excel vba excel-vba excel-2010 excel-2013

这可能是我曾经问过的最愚蠢的问题,但是很难找到像这样的事情的答案。

我有一个带有一堆模块/子程序的程序,每个程序都计算一个不同的变量。它们非常复杂,所以我喜欢将它们分开。现在我想要一个更早的模块根据用户输入跳转到另一个模块。我以为我可以使用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(在我的程序中都是非常大的)保存在自己的模块中,因为它更容易跟踪它们,并且更容易向其他人解释/演示应用程序流。

3 个答案:

答案 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