VBA 防止在代码中使用 "End" 关闭用户窗体
VBA prevent closing of UserForm with "End" in code
在我的电子表格中,我有一个应该始终打开的用户窗体。
偶尔,我的代码会包含一个 "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
这是代码构建方式的粗略示例(此时它相当长)。因此,根据 "variable",Test2 中会发生不同的事情。但是如果Variable是1,那么Test1中的"random code"就不能执行了,所以我不得不停止代码。我尝试用 "Exit Sub" 替换 "End" 这只会从 运行 停止 Test2 中的代码,当它返回到 Test1 时是否会给我一个错误。
编辑2:
Test1() 实际上是四个不同的子(此时,将添加更多),它们都调用 Test2()。这就是为什么我选择将它分成这么多潜艇并从潜艇内部调用它们。
不,如果您坚持使用 End
,则不会。这基本上与单击开发人员 window 中的 "Stop" 按钮具有相同的效果。您应该(很可能) 而不是 使用 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
关闭所有内容并杀死您拥有的所有变量和对象。
这可能是结束任何潜艇的最糟糕的方式,而且您很可能不需要它。
https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/end-statement
您需要以某种方式告诉 Test1 它需要停止。解决此问题的一种方法是将您的 subs 更改为函数和 return 一个指示状态的值。像这样的东西会起作用:
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",我在其中根据某些 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
这是代码构建方式的粗略示例(此时它相当长)。因此,根据 "variable",Test2 中会发生不同的事情。但是如果Variable是1,那么Test1中的"random code"就不能执行了,所以我不得不停止代码。我尝试用 "Exit Sub" 替换 "End" 这只会从 运行 停止 Test2 中的代码,当它返回到 Test1 时是否会给我一个错误。
编辑2: Test1() 实际上是四个不同的子(此时,将添加更多),它们都调用 Test2()。这就是为什么我选择将它分成这么多潜艇并从潜艇内部调用它们。
不,如果您坚持使用 End
,则不会。这基本上与单击开发人员 window 中的 "Stop" 按钮具有相同的效果。您应该(很可能) 而不是 使用 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
关闭所有内容并杀死您拥有的所有变量和对象。
这可能是结束任何潜艇的最糟糕的方式,而且您很可能不需要它。
https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/end-statement
您需要以某种方式告诉 Test1 它需要停止。解决此问题的一种方法是将您的 subs 更改为函数和 return 一个指示状态的值。像这样的东西会起作用:
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