VBA 防止在代码中"End"关闭用户窗体



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

偶尔,我的代码将包含一个"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 中的"随机代码"就无法因此执行,所以我必须停止代码。我尝试将"结束"替换为"退出子",这只会阻止 Test2 中的代码运行,当它返回到 Test1 时它会给我一个错误。

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

不,如果您坚持使用 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

您需要以某种方式告诉 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

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

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

VBA 中的"结束"和"退出子"之间的尊重是什么?

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

我刚刚遇到了类似的问题。我没有重写所有代码来跟踪全局变量,而是选择使用用户定义的错误。我在代码末尾已经有一个错误处理程序,因此重写很少。像这样的东西;

Sub Main_Loop ()
On Error goto EHandler
Call Sub1
Call Sub2
Function X
Ehandler:
If err.number = user_error then clean_up _
   else msgbox ("OOPS!")
End sub

就我而言,我有一个用户表单,通过 winapi 调用成为桌面和最顶层的子窗口,因此我可以在办公应用程序的所有打开窗口中使用它,将表单数据输入到大型机终端。当表单验证失败时,我希望代码执行继续,但跳过数据输入。我也不想关闭用户表单。

好处是这也使测试更快。

基本上这是一个 goto 语句,但作为一个错误,它即使在嵌套的子/函数调用中也能工作。猜猜我终究还是无法摆脱GOTO。哦,好吧。我会因为只使用一个 goto 而下地狱吗?当我发现时,我会更新这篇文章。:P

相关内容

最新更新