【问题标题】:Handling only specific VBA Errors仅处理特定的 VBA 错误
【发布时间】:2019-03-20 03:02:57
【问题描述】:

运行我的代码时可能出现两个错误。第一个是我的 .Find 方法找不到任何东西的常见错误,如果发生这种情况,我希望它在接下来恢复。这是完全正常的情况,我需要将其留给我的经理批准代码(仍然使用旧版 VBA 代码,他不敢更改它。

我想指定如果看到此错误,则什么也不做,但如果它是一个特定的其他错误,则标记它并由更强大的错误处理来处理。

我想“忽略”的错误(如在 Resume Next 或 GoTo 其余代码中的特定位置而不担心错误,我不担心代码的后面部分)是运行时错误 91 . 具体在代码中:

toFindCell1 = Cells.Find(nameVar).Row

nameVar 会根据列表中的 for 语句进行更改。然后我计划根据现有信息检查它并使用该变量来确定它是否存在。如果没有,那么它会添加它。

如何指定要在 VBA 中处理的错误?

【问题讨论】:

  • 在这种情况下“ingore”是什么意思?不分配给toFindCell1?为了正确回答这个问题,我们需要看到比您想要抑制错误的行更多的代码。否则,您的下一个问题很可能是“为什么现在我忽略了 .Find 错误,X 不起作用”。
  • Ignore as if I Cells.Find("whatever") t 遵循相同的模式。本质上,我可以 Resume Next 来“忽略”错误,但任何其他错误都会被正确捕获并发送到已经创建的错误处理程序。 (忘记标记)@Comintern
  • 那为什么还要测试错误呢?将.Find结果赋值给Range,然后测试是否为Nothing。对于您想要在此处执行的操作,使用错误处理进行流量控制过于复杂。错误 91 是因为 .Find 返回 Nothing 然后您尝试使用返回值而不测试它

标签: excel vba error-handling


【解决方案1】:

最好的做法确实是使用If Not result Is Nothing Then,正如Mathieu的回答中提到的那样。


但是,在某些特定情况下,捕获特定错误号并通过修复它继续是一个好主意。这绝对不是其中之一,而是一个很好的说明,说明如何与Err.Number“玩”:

Sub TestMe()

    On Error GoTo TestMe_Error

    Dim result As Range
    Set result = Cells.Find("Something")

    Debug.Print result.Row
    Debug.Print "Something here"
    Debug.Print 5 / 0
    Debug.Print "This line is unreachable."

TestMe_Error:

    Select Case Err.Number
    Case 91
        Debug.Print "ERROR 91!"
        Err.Clear
        Set result = Range("A100")
        Resume
    Case Else
        Debug.Print "Some other error!"
    End Select

End Sub

上面的代码发生了什么?在Debug.Print result.Row 线上,它抛出error 91,它被错误处理程序捕获,然后用Err.Clear 清除。正如预期的那样,Set result = Range("A100") 用于错误处理程序,代码从引发错误的行继续,但这次,result 是有效的。一次,它到达新的错误5/0,然后抛出与91不同的错误并退出。

这是输出:

ERROR 91!
 100 
Something here
Some other error!

请记住,许多开发人员可能会考虑使用条件错误处理spaghetti code

【讨论】:

    【解决方案2】:
    toFindCell1 = Cells.Find(nameVar).Row
    

    Range.Find 返回Nothing.Row 成员调用不合法。 不要这样做!

    如果您的代码一开始没有抛出错误 91,那么您就不需要处理错误 91。

    Dim result As Range
    Set result = Cells.Find(nameVar)
    If Not result Is Nothing Then
        toFindCell1 = result.Row
        '....
    Else
        'not found.
    End If
    

    【讨论】:

    • 这太聪明了,我没有想到这样的“双重否定”。我将它添加到我的代码中,它就像一个魅力,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多