我在类模块中处理错误时遇到困难。
我的应用程序是按以下方式设置的。
Excel 工作表上有一个 ActiveX 对象(我们称之为 Lable1),它为它分配了一个带有事件的类(ClassA)。当触发 mouseup 事件时,该类将启动一个过程 (SubB)。
SubB 初始化 ClassC,这有时会在初始化期间产生运行时错误。所以我在 ClassA 中引入了错误处理,它启动了每个用户子例程,因此错误可以冒泡到顶部并在那里得到处理(将上传日志,以便开发团队查看)。
我遇到的问题是错误处理不起作用。用户仍然得到运行时错误对话框,而不是干净的错误处理。
这是示例代码:
在 Sheet1 创建 Label1 (activeX) 并添加以下代码:
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
If ButtonToClick Is Nothing Then
Set ButtonToClick = New ClassA
Set ButtonToClick.ButtonLabel = Label1
End If
End Sub
创建 ClassA 并添加:
Public WithEvents ButtonLabel As MSForms.Label
Private Sub ButtonLabel_MouseUp(ByVal MouseButton As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
On Error GoTo EH
SubB
Exit Sub
EH:
MsgBox "OMG AN ERROR!"
End Sub
创建 Module1 并添加:
Public ButtonToClick As ClassA
Sub SubB()
Dim WhyTho As ClassC
Set WhyTho = New ClassC
End Sub
创建 ClassC 并添加:
Private Sub Class_Initialize()
Dim i As Long
i = 7 / 0
End Sub
应该处理错误,代码应该跳转到 EH: 在 ButtonLabel_MouseUp,但我仍然得到运行时对话框。我做错了什么?
如果这是 VBA 的限制,我应该怎么做才能解决它?
我遇到的问题与 VBE 设置有关。 “Break in Class Module”导致 ClassA/SubB 中的错误处理在 ClassC 中被忽略。
最佳答案
由于我刚刚遇到类似的问题,这是我的解决方案:
检查您(或正在执行的计算机)VBE 的错误行为。不确定英文 Office 中的正确名称,但应该是 Tools
, Options
, 标签 General
.右侧有 3 个单选按钮:
打断:
如果选择了第一个,那就是问题的根本原因。它将导致每个错误都引发错误对话框,无论它是否被处理。
第三个选项在开发类时不是很有用,当它被激活并单击
Debug
时。在错误对话框中,它只会将您带到类模块的入口点。因此,在到达产生错误的实际行之前,您可能必须手动执行很多行代码(F8
)。这个设置(Break on every error)可能会在生产设置中产生一个潜在的问题:它绕过了您可能进行的每一位错误处理。如果出于某种原因,用户/客户端启用了此设置,您的应用程序将无法使用。快速搜索(Google/stackoverflow)表明该设置无法在运行时有效更改。 (至少不是以编程方式。)更改它的唯一方法是(a)让用户更改它或(b)更改相应的注册表项并重新启动 VBA 主机应用程序(在本例中为 Excel)。
关于excel - Vba 错误处理和类 (Excel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50872204/