VBA阻止在代码中使用“结束”关闭UserForm

时间:2017-11-14 10:19:00

标签: excel vba excel-vba userform

在我的电子表格中,我有一个应该始终打开的UserForm。

有一段时间,我的代码将包含一个“结束”,我根据一些if语句退出代码。

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

编辑:

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时会给我一个错误。

EDIT2: Test1()实际上是四个不同的subs(此时,将会添加更多)所有调用Test2()。这就是为什么我选择将它分成很多潜艇并从潜艇中调用它们的原因。

3 个答案:

答案 0 :(得分:2)

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

<强>更新

根据您的代码,我认为Test3()没有任何理由嵌套在Test2()中,因为它运行 随机代码或< / strong> Test3()(从不两者兼而有之)。有什么阻止你将所有不同的案例分成不同的子集,然后在主子域中执行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

答案 1 :(得分:1)

End关闭所有内容并杀死你拥有的所有变量和对象。

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

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

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

答案 2 :(得分:1)

你需要告诉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