捕获导致错误的变量/对象名称

时间:2014-08-13 17:02:12

标签: vba excel-vba error-handling excel

如何捕获导致VBA错误的变量名称或对象名称?

实施例

Sub test()
    On Error GoTo Handler
    i = 0
    n = 1/i
Handler:
    Select Case variablename
        Case "n"
            'do something................

2 个答案:

答案 0 :(得分:1)

错误不是由变量引起的。该错误是由尝试将1除以0的代码行引起的。分配实际上不会发生。

我在积极开发时发现诊断问题的最佳方法是在错误处理程序中使用Stop然后Resume

Public Sub func()
On Error GoTo ErrHandler

'... some code here ...

    Exit Sub

ErrHandler:
    Stop
    Resume
End Sub

这种方法的工作方式是,当Stop上出现错误时,VBA将中断(暂停执行,显示指令指针箭头和黄色突出显示)。您可以单步执行Resume,然后再一次找出导致错误的特定代码行。

一旦你开始了解你遇到的错误,你就可以构建单独的If ...然后让他们适当地处理每个错误。当您准备将代码发布到生产环境中时(例如,对于其他用户),您需要将意外的错误处理程序替换为Stop / Resume,该处理程序将其记录或显示给用户。

答案 1 :(得分:1)

虽然Blackhawk的答案适用于一个小例子,但我个人更愿意避免修改代码来追踪这样的错误。如果我正在处理大量试图追踪令人讨厌的错误的文件,那么我完全有可能忘记删除任何"特殊代码"在我完成调试之后,比如Stop语句等。如果任何这样的代码生产,那对我来说可能会非常尴尬。另外,为了弄清楚错误发生在哪里(在你的例子中并不总是那么明显!),将这段代码添加到许多不同的地方可能会很烦人。(/ p >

由于这些原因,我更喜欢使用VBA编辑器提供的功能。所以:

  1. 打开 VBA编辑器
  2. 转到工具>选项
  3. 选择常规标签,然后点击中断所有错误单选按钮。
  4. 点击确定
  5. 现在运行您的代码,当它到达此行时您会注意到:

    n = 1/i
    

    您将收到一个错误对话框,说明问题所在("运行时错误' 11&#39 ;:按零划分" )和您可以选择单击对话框中的" Debug" 按钮,这将打破上面一行的执行,并以黄色突出显示。

    完成调试并找到一直困扰您的错误后,您可以返回VBA编辑器选项并恢复错误陷阱"设置回默认选项("中断未处理的错误")。

    这样,在发布代码之前,您还没有对要记住恢复的代码进行任何更改,只需点击几下就可以设置/取消设置此行为的实际操作。