Vba错误处理和类(Excel)

时间:2018-06-15 08:57:18

标签: excel vba class error-handling

我在课堂模块中遇到错误处理有困难。

我的应用程序设置如下。

在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中的错误处理。

1 个答案:

答案 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)。