VBA中的错误处理 - On Error Resume Next

4

我有下面的代码:

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

但是我不知道如何使用这段代码。

如果单元格中有错误,它应该是什么颜色? - user4039065
2
不要这样做。不行。On Error Resume Next 只是简单地忽略错误。你需要想办法避免出现错误。另外,似乎你可以通过条件格式化来完成这个任务。 - RubberDuck
1
您可能还想阅读一些这些问题的内容。 - RubberDuck
3个回答

9

这取决于你想要做什么。

  • On Error Resume Next会忽略错误发生的事实。这是使您的代码执行完成的好方法,但几乎可以保证它不会做您想要的事情。
  • On Error Goto 0是默认响应。它将弹出VBA生成的错误消息。
  • On Error Goto <label>会在发生错误时导致您的代码跳转到指定的标签,并允许您根据错误代码采取适当的操作。

最后一个选项On Error Goto <label>通常是最有用的,您需要深入挖掘如何最好地将其用于您的应用程序。

这个网站是我从中获取上面的详细信息的地方,通常是从谷歌搜索“excel vba on error”获得的第一个结果。我自己也多次使用了该参考资料。


7

我理解您的要求是如何处理在循环遍历单元格并检查值时遇到的常见工作表错误。如果您尝试查看包含错误(例如 #N/A,#DIV/0!,#VALUE!等)的单元格,则会得到类似以下的结果:

Runtime error '13':
Type mismatch.

这些可以使用VBA的IsError函数捕获。
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

在上面的代码中,我捕获了包含错误的单元格并将它们标记为绿色。请注意,在检查零长度之前,我先检查了这些单元格是否有错误。

        IsError against worksheet errors/values


我正在使用这个解决方案来帮助我的错误捕获代码,如果Vlookup找不到任何内容,我会得到"Expected Array"错误。你必须使用.Cells(row, col)格式吗? - Matt Gaydon
如果您正在使用worksheetfunction.vlookup或application.worksheetfunction.vlookup,那么请切换到application.vlookup。IsError或其变体将捕获无匹配错误。 - user4039065
我正在电子表格中使用Vlookup。 VBA代码将查找值粘贴到单元格中,然后也将所有返回值存储为变量。我这样做是为了避免循环搜索60000行以查找查找值。 - Matt Gaydon
这可能太复杂了,无法在评论中解决。请发布一个包含所有细节的新问题。 - user4039065

5

我通常尽量避免使用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 Pearson的网站可能是我多年前第一次获取上述代码的地方。 - Darren Bartrup-Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接