Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA阻止关闭代码中带有“End”的UserForm_Vba_Excel_Userform - Fatal编程技术网

VBA阻止关闭代码中带有“End”的UserForm

VBA阻止关闭代码中带有“End”的UserForm,vba,excel,userform,Vba,Excel,Userform,在我的电子表格中,我有一个应该随时打开的用户表单 偶尔,我的代码将包含一个结束,在此结束时,我将根据一些if语句退出代码 问题是这会关闭用户表单,有没有办法防止这种情况发生 编辑: 这是一个粗略的例子,说明了代码是如何构建的。因此,根据变量的不同,Test2中会发生不同的事情。但是如果变量是1,那么Test1中的随机代码就不能执行,所以我必须停止代码。我尝试用Exit Sub替换End,这只会停止Test2中的代码运行,因为它返回Test1时会给我一个错误 编辑2: Test1实际上是四个不同的

在我的电子表格中,我有一个应该随时打开的用户表单

偶尔,我的代码将包含一个结束,在此结束时,我将根据一些if语句退出代码

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

编辑:

这是一个粗略的例子,说明了代码是如何构建的。因此,根据变量的不同,Test2中会发生不同的事情。但是如果变量是1,那么Test1中的随机代码就不能执行,所以我必须停止代码。我尝试用Exit Sub替换End,这只会停止Test2中的代码运行,因为它返回Test1时会给我一个错误

编辑2:
Test1实际上是四个不同的sub,在这一点上,将添加更多调用Test2的sub。这就是为什么我选择把它分成许多子系统,并从子系统内部调用它们

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

更新:

根据您的代码,我看不出有任何理由将Test3嵌套在Test2中,因为它要么运行随机代码,要么运行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
End关闭所有内容并删除所有变量和对象

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


您需要告诉Test1它需要停止。解决此问题的一种方法是将sub更改为函数,并返回一个指示状态的值。类似这样的方法会奏效:

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

也许修改您的代码以退出Sub而不是End?我不知道End到底做了什么,这只是我第一次遇到这样的问题。否则您将如何停止代码?我试着添加一个代码如何工作的示例?用出口接头更换端部不起作用。谢谢!否则你怎么停止代码?我试着添加一个我正在尝试做的例子。看看更新。我不知道你到底想做什么,所以我不能说得很具体。但它可能应该和我发布的内容类似。它也比您的原始代码更易于阅读。如您所见,变量=0的大小写包含三行。这是为了表明您可以而且可能应该将代码拆分为多个子代码。是的,我知道。问题是,如果不知道所有的代码和大约1000行代码,就有点难以解释。我之所以选择在多个子系统中拆分代码,是因为Test1实际上是4个不同的子系统,它将调用Test2,如果我遵循您的建议,这将使代码非常长。Test3可以很容易地嵌入到Test2中。问题是,嵌套越多,它就越难读取。如果开始在嵌套的深处使用End,情况会变得更糟。难道你不能创建你所需要的所有sub,然后根据我的examle这样的条件,用If语句调用所需的sub,按照所需的顺序调用所需的sub吗?虽然这可能会起作用,但我确实看到有可能会产生一些非常混乱的代码。另外,在那个具体的例子中,Exit函数没有任何效果。确实,Exit函数在这里没有效果,但是为了继续使用许多嵌套的sub,这将解决问题,我意识到这可能会使它更容易阅读,但是,当Test2 sub在以前的许多sub中使用,但仍然没有完成时,这将是一个临时解决方案。谢谢大家的帮助!
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