问:如何使用 Excel VBA 确定整个工作簿中的任何单元格是否有错误?
通常错误会除以 0 或 #value 错误,但这个列表并不详尽(或者是吗? - 我不知道是否存在更多)
有没有办法确定单元格是否包含错误,然后跳过脚本中的进一步处理,而不吐出调试/警告/错误消息。
类似这样的东西
if value in current.Workbook.cell is error then go to <jump>
OR
if value in old.Workbook.cell is error then go to <jump>
其中
jump
是 if 语句末尾但在循环内的标记。
该脚本比较两个工作簿之间的值,并用颜色更新当前工作簿以显示差异。
我根本没有VBA经验。但我明白了给我的脚本的要点。
谢谢你。
您可以使用
VarType
功能跳过有错误的单元格。例如:
If VarType(ActiveCell.Value) <> vbError Then
' do something
End If
VarType
函数对于验证数据类型也非常有用。例如,如果您的代码需要一个日期值,但有时会遇到文本,您可以使用此函数来审查数据并优雅地处理异常。
这是一段代码,在立即窗口中记录了工作表名称、单元格地址和公式,其中有一个电子表格公式错误...
Dim ws As Worksheet, r As Range
For Each ws In Worksheets
For Each r In ws.UsedRange
If IsError(r.Value) Then
Debug.Print r.Parent.Name, r.Address, r.Formula
End If
Next
Next
鉴于您最初的问题是如何使用 VBA 检测工作簿的任何单元格中的错误,那么您应该寻找一种非常有效的方法 - 查看每个单元格的时间成本非常昂贵!
有两个选项:
对于 SpecialCells,请参阅下面的代码。这利用了以公式形式存在的现成错误集合
请注意,常量也有一个错误集合,因此,如果您已复制然后在公式错误上运行特殊粘贴作为值,那么您需要使用
Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)
来检测这些
您还可以使用手动检测 SpecialCells
请注意,在 xl2010 之前,SpecialCells 可以处理的区域仅限于 8192 个区域
Sub ErrorList()
Dim ws As Worksheet
Dim rng1 As Range
Dim strOut As String
For Each ws In ActiveWorkbook.Sheets
Set rng1 = Nothing
On Error Resume Next
Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
On Error GoTo 0
If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
Next ws
If Len(strOut) > 0 Then
MsgBox "Error List:" & vbNewLine & strOut
Else
MsgBox "No Errors", vbInformation
End If
End Sub
您可以使用 VBA 中的
IsError()
函数以及工作表中的公式。
有关示例,请参阅 http://vbadud.blogspot.com/2007/04/using-vbas-iserror-function.html。
还有另一种方法可以处理这个问题:将
On Error Resume Next
添加到代码中(通常只需将其放在循环之前)。
如果某个单元格出错,它只会跳过它并移至循环中的下一个元素:)
要检查工作表是否有任何错误,您可以使用此功能:
Function ContainsError(sheet)
On Error GoTo ErrorHandler
r = sheet.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
ContainsError = True
Exit Function
ErrorHandler:
ContainsError = False
End Function
因此,如果您想检查整个工作簿,您可以编写另一个使用前一个函数的函数,如下所示:
Function ContainsErrorWB(book)
For Each ws In book.Worksheets
If ContainsError(ws) Then
ContainsErrorWB = True
Exit Function
End If
Next
ContainsErrorWB = False
End Function
你可以这样使用它:
If ContainsErrorWB(ThisWorkbook) Then
'Do something
Else
'Do something else
End If
请记住将它们都包含在您的模块中。