在我的电子表格中,我有一个应该始终打开的用户表单。
偶尔,我的代码将包含一个"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