【问题标题】:VBA prevent closing of UserForm with "End" in codeVBA 防止在代码中使用“结束”关闭用户窗体
【发布时间】:2017-11-14 10:19:00
【问题描述】:

在我的电子表格中,我有一个应该始终打开的用户窗体。

偶尔,我的代码会包含一个“End”,我会在其中根据某些 if 语句退出代码。

问题是这会关闭用户窗体,有没有办法防止这种情况发生?

编辑:

Sub Test1()
    'Random code       
    Call Test2(Variable)
    'Random code           
End Sub

Sub Test2(ByVal Variable as Double)
    If Variable = 0 then
        'Random code
    End If
    If Variable = 1 then
        Call Test3
        End 'Original placement of End 
    End If
End Sub

Sub Test3()
    'Random code
End Sub

这是如何构建代码的粗略示例(此时它相当长)。因此,根据“变量”,Test2 中会发生不同的事情。但是如果变量为 1,那么 Test1 中的“随机代码”就无法执行,所以我必须停止代码。我尝试用“Exit Sub”替换“End”,这只会使Test2中的代码停止运行,当它返回到Test1时它会给我一个错误。

编辑2: Test1() 实际上是四个不同的 subs(此时,将添加更多),它们都调用 Test2()。这就是为什么我选择将它分成这么多的潜艇并从潜艇内部调用它们。

【问题讨论】:

  • 也许将您的代码修改为Exit Sub 而不是End

标签: vba excel userform


【解决方案1】:

不,如果您坚持使用End,则不会。这基本上与单击开发人员窗口中的“停止”按钮具有相同的效果。您应该(很可能)使用End。我无法告诉你应该使用什么,因为我不知道你想要达到什么目的。

更新:

根据您的代码,我看不出有任何理由将Test3() 嵌套在Test2() 中,因为它运行要么随机代码 @ 987654325@(从不两者兼有)。是否有什么阻止您将所有不同的案例拆分为不同的子,然后在主子中执行If 语句?

Sub Main()
    If Variable = 0 Then
        'Random code from before Test2()
        'Random code from Test2()
        'Random code from after Test2()

    ElseIf Variable = 1 Then
        Call Test3()

    Else
        MsgBox "Variable must be 0 or 1!"

End Sub

【讨论】:

  • 谢谢!否则你会如何停止代码?我尝试添加一个我正在尝试做的示例。
  • 看看更新。我不知道你到底想做什么,所以我不能说得很具体。但它可能应该像我发布的那样。它也比您的原始代码更容易阅读。如您所见,Variable = 0 案例包含三行。这是为了表明您可以(并且可能应该)将代码拆分为多个Subs
  • 是的,我知道。问题是在不知道所有代码及其大约 1000 行的情况下很难解释。我选择将代码拆分为多个子程序的原因是,Test1 实际上是 4 个不同的子程序,然后会调用 Test2,如果我遵循您的建议,这会使代码很长。 Test3 可以很容易地嵌入到 Test2 中。
  • 问题是,你嵌套的越多,它就越难阅读。如果您开始在嵌套深处使用End,情况会变得更糟。难道你不能创建你需要的所有子程序,然后根据某种条件(比如我的例子)创建一个If 语句,以所需的顺序调用所需的子程序吗?
【解决方案2】:

您需要以某种方式告诉 Test1 它需要停止。解决此问题的一种方法是将您的 subs 更改为函数并返回一个指示状态的值。这样的事情会起作用:

Function Test1() As Integer
    Dim i As Integer

    'Random code
    i = Test2(Variable)
    If i = 1 Then Exit Function
    'Random code
End Function

Function Test2(ByVal Variable As Double) As Integer
    Test2 = 0

    If Variable = 0 Then
        'Random code
    End If
    If Variable = 1 Then
        Call Test3
        Test2 = 1
        Exit Function
    End If
End Function

Function Test3() As Integer
    'Random code
End Function

【讨论】:

  • 虽然这可行,但我确实看到了最终会出现一些非常混乱的代码的风险。此外,在该特定示例中,Exit Function 根本没有任何效果。
  • 没错,Exit 函数在这里没有任何作用,但是为了继续使用许多嵌套的 subs,这将解决问题,我意识到它可能会使阅读更加混乱,但是当Test2 潜艇在许多以前的潜艇中使用过(但仍未完成),这将是一个临时解决方案。谢谢大家的帮助!
【解决方案3】:

End 关闭任何东西并杀死你拥有的所有变量和对象。

这可能是结束任何子的最糟糕的方式,而且很可能你不需要它。

What's the deference between "end" and "exit sub" in VBA?

https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/end-statement

【讨论】:

  • 我不知道 End 到底做了什么,这只是我第一次遇到这样的问题。
  • 否则你会如何停止代码?我尝试添加我的代码如何工作的示例?用 Exit Sub 替换 End 不起作用。
猜你喜欢
  • 2018-01-11
  • 1970-01-01
  • 2012-02-08
  • 2023-04-05
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多