【问题标题】:Error handling in VBA - on error resume nextVBA 中的错误处理 - 下一个错误恢复
【发布时间】:2015-06-06 02:14:00
【问题描述】:

我有以下代码:

ErrNr = 0
For Rw = StRw To LsRw 'ToDo speed up with fromrow torow
    If Len(ThisWorkbook.Sheets(TsSh).Cells(Rw, TsCl)) = 0 Then
        ThisWorkbook.Sheets(TsSh).Cells(Rw, TsCl).Interior.ColorIndex = 46
        ErrNr = ErrNr + 1
    End If
Next

我的问题是如果页面上有错误,我的代码在那之后就没有运行。我认为解决方案应该是:

On Error Resume Next
N = 1 / 0    ' cause an error
If Err.Number <> 0 Then 
    N = 1
End If

但我不知道如何使用此代码。

【问题讨论】:

  • 如果单元格出现错误应该是什么颜色?
  • 不要。没有。On Error Resume Next 只是 swallows 错误。您首先需要弄清楚如何避免错误。另一方面,您似乎可以使用Conditional Formatting 完成此操作。
  • 您可能还想阅读一些these questions

标签: vba excel error-handling


【解决方案1】:

这取决于你想做什么。

  • On Error Resume Next 将忽略发生错误的事实。这是让您的代码执行完成的好方法,但只会保证它不会按照您的意愿行事
  • On Error Goto 0 是默认响应。它会弹出VBA正在生成的错误消息
  • On Error Goto &lt;label&gt; 将导致您的代码在发生错误时跳转到指定的标签,并允许您根据错误代码采取适当的措施。

最后一个选项On Error Goto &lt;label&gt; 通常是最有用的,您需要深入研究如何在您的应用程序中最好地使用它。

This site 是我从上面获得详细信息的地方,通常是来自Googling for "excel vba on error" 的第一个结果。我自己多次使用过这个引用。

【讨论】:

    【解决方案2】:

    我已经解释了您在循环一系列单元格并检查值时如何处理常见工作表错误的要求。如果您尝试查看包含错误的单元格(例如 #N/A、#DIV/0!、#VALUE! 等),您将得到如下信息:

    Runtime error '13':
    Type mismatch.
    

    这些可以用 VBA 的IsError function 捕获。

    Dim rw As Long
    
    With ThisWorkbook.Sheets(TsSh)
        For rw = StRw To LsRw
            If IsError(.Cells(rw, 1)) Then
                .Cells(rw, 1).Interior.ColorIndex = 10
            ElseIf Not CBool(Len(.Cells(rw, 1).Value2)) Then
                .Cells(rw, 1).Interior.ColorIndex = 46
            End If
        Next rw
    End With
    

            

    在上面,我捕捉到有错误的单元格并将它们着色为绿色。请注意,我正在检查它们是否存在错误之前我检查零长度。

    【讨论】:

    • 如果 Vlookup 找不到任何内容并且我收到错误“预期数组”,我正在使用此解决方案来帮助我捕获错误代码。您必须使用.Cells(row, col) 格式吗?
    • 如果您使用的是 worksheetfunction.vlookup 或 application.worksheetfunction.vlookup,请切换到 application.vlookup。 IsError 或变体不会捕获任何匹配错误。
    • 我在电子表格中使用 Vlookup。 VBA 代码将查找值粘贴到单元格中,然后将所有返回值也存储为变量。我这样做是为了避免遍历 60,000 行来查找查找值。
    • 这可能涉及太多,无法在 cmets 中解决。请发布一个包含所有详细信息的新问题。
    【解决方案3】:

    我通常会尽量避免 On Error Resume Next,因为无论出现什么错误,它都会尝试继续(尽管在某些情况下它很有用)。

    下面的代码将所有错误传递到可以根据具体情况处理的过程之外。

    Sub test1()
    
        Dim n As Double
    
        On Error GoTo ERROR_HANDLER
    
            n = 1 / 0  ' cause an error
    
        On Error GoTo 0
        Exit Sub
    
    ERROR_HANDLER:
        Select Case Err.Number
            Case 11 'Division by zero
                n = 1
                Err.Clear
                Resume Next
            Case 13 'Type mismatch
    
            Case Else
                'Unhandled errors.
                MsgBox "Error " & Err.Number & vbCr & _
                    " (" & Err.Description & ") in procedure test1."
                Err.Clear
    
        End Select
    
    End Sub
    

    【讨论】:

    • 正如@Freeman 在我发帖前几秒钟所说的那样——Chip Pearsons 网站可能是我多年前首先获得上述代码的地方。
    猜你喜欢
    • 2014-02-20
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多