excel - Vba 错误处理和类 (Excel)

标签 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 设置有关。 “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/

    相关文章:

    regex - vba 正则表达式 : dot matching newline

    ReactJS - 从另一个组件调用一个组件方法

    c - 从 C 代码使用 D 类

    excel - VBA:无需剪贴板复制粘贴

    vba - Excel 2010 将范围和图片粘贴到 Outlook 中

    python - 腐败的可能性 : Reading Excel Files with Pandas

    Excel 多行条件色阶

    mysql - 如何将 MySQL 中的数据插入/选择到 Excel/VBA?

    c++ - 派生自纯虚模板类

    excel - 如何在使用 Apache POI 打开 Excel 时修复错误。错误说 "We found a problem with some content in xyz.xlsm. Do you want..."?