我在课堂模块中遇到错误处理有困难。
我的应用程序设置如下。
在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设置有关。 “类中断模块”导致在ClassC中忽略ClassA / SubB中的错误处理。
答案 0 :(得分:1)
由于我刚遇到类似的问题,这是我的解决方案:
检查您(或正在执行的计算机)VBE的错误行为。不确定英语办公室中的正确名称,但它应该与refTest.on('value', function(data) {
var conversations = data.val();
for (conversation in conversations){
for (message in conversation) {
if (message.userId == 288) {
// do whatever you need
// and eventually return something to break the loops
}
}
}
,Tools
,标签Options
一致。在那里,右侧是3个单选按钮:
休息:
如果选择了第一个,那就是问题的根本原因。无论是否处理,都会导致出现错误对话的每一个错误
第三个选项在开发类时不是很有用,因为当它被激活并且您在错误对话框中单击General
时,它只会带您进入类模块的入口点。因此,在到达生成错误的实际行之前,您可能需要手动完成相当多的代码行(Debug
)。
此设置(每个错误中断)的潜在问题可以在生产设置中创建:它可以绕过您可能具有的每一个错误处理位。如果由于某种原因,用户/客户端启用了此设置,则您的应用程序将无法使用。快速搜索(Google / stackoverflow)表明该设置无法在运行时有效更改。 (至少不是以编程方式。)更改它的唯一方法是(a)让用户更改它或(b)更改相应的注册表项并重新启动VBA主机应用程序(在这种情况下为Excel)。