Csa*_*áky 4 error-handling excel vba excel-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
Next
Run Code Online (Sandbox Code Playgroud)
我的问题是如果页面上有错误,那么我的代码没有运行.我认为解决方案应该是:
On Error Resume Next
N = 1 / 0 ' cause an error
If Err.Number <> 0 Then
N = 1
End If
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用这段代码.
这取决于你想做什么.
On Error Resume Next将忽略错误发生的事实.这是让代码执行完成的好方法,但只是保证它不会做你想要的.On Error Goto 0是默认响应.它将弹出VBA正在生成的错误消息On Error Goto <label> 将导致您的代码在发生错误时跳转到指定的标签,并允许您根据错误代码采取适当的操作.最后一个选项On Error Goto <label>通常是最有用的,你会想要深入研究如何最好地将它用于你的应用程序.
这个网站是我从上面获得详细信息的地方,通常是谷歌搜索"excel vba on error"的第一个结果.我自己多次使用过这个参考文献.
我通常会尽量避免 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
Run Code Online (Sandbox Code Playgroud)
小智 6
我已经解释了在循环遍历一系列单元格并检查值时如何处理常见工作表错误的要求.如果您试图查看包含错误的单元格(例如#N/A,#DIV/0!,#VALUE!等),您将得到如下内容:
Runtime error '13':
Type mismatch.
Run Code Online (Sandbox Code Playgroud)
这些可以通过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
Run Code Online (Sandbox Code Playgroud)

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