error handling在VBA中 – 错误恢复下一步
我是VBA新手。
我有以下代码:
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
我的问题是,如果页面上有错误,我的代码不会运行。 我认为解决scheme应该与:
On Error Resume Next N = 1 / 0 ' cause an error If Err.Number <> 0 Then N = 1 End If
但是我不知道如何在这里使用这个代码。
我已经解释了如何在循环遍历单元格范围和检查值时处理常见工作表错误的要求。 如果您尝试查看包含错误的单元格(例如#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
在上面,我抓住了错误的单元格,并将它们着色为绿色。 请注意,在检查零长度之前 ,我正在检查它们是否有错误。
这取决于你想要做什么。
-
On Error Resume Next
将忽略错误发生的事实。 这是让你的代码执行完成的好方法,但只是保证它不会做你想要的 。 -
On Error Goto 0
是默认响应。 它会popupVBA生成的错误消息 -
On Error Goto <label>
会导致您的代码在发生错误时跳转到指定的标签,并允许您根据错误代码采取适当的操作。
最后一个选项On Error Goto <label>
通常是最有用的,你将需要做一些挖掘如何最好地使用它的应用程序。
这个网站是我从上面得到的细节,而且通常是第一个来自谷歌search“excel vba出错”的结果 。 我已经多次使用过这个参考。
我一般会尽量避免在错误恢复下一个,因为它会尝试继续,不pipe错误是什么(有些情况下,虽然它是有用的)。
下面的代码将所有的错误都传递给可以按个别情况处理的程序。
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