如何使用 Excel VBA 确定整个工作簿中的任何单元格是否有错误

问题描述 投票:0回答:6

问:如何使用 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经验。但我明白了给我的脚本的要点。

谢谢你。

excel vba
6个回答
17
投票

您可以使用

VarType
功能跳过有错误的单元格。例如:

If VarType(ActiveCell.Value) <> vbError Then
    ' do something
End If

VarType
函数对于验证数据类型也非常有用。例如,如果您的代码需要一个日期值,但有时会遇到文本,您可以使用此函数来审查数据并优雅地处理异常。


6
投票

这是一段代码,在立即窗口中记录了工作表名称、单元格地址和公式,其中有一个电子表格公式错误...

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

4
投票

鉴于您最初的问题是如何使用 VBA 检测工作簿的任何单元格中的错误,那么您应该寻找一种非常有效的方法 - 查看每个单元格的时间成本非常昂贵!

有两个选项:

  1. 使用 Excel 的 SpecialCells 来简化流程
  2. 使用我的Mappit! addin 配置为报告电子表格错误

对于 SpecialCells,请参阅下面的代码。这利用了以公式形式存在的现成错误集合

请注意,常量也有一个错误集合,因此,如果您已复制然后在公式错误上运行特殊粘贴作为值,那么您需要使用

Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)
来检测这些

您还可以使用手动检测 SpecialCells

  • 选择感兴趣区域中的所有单元格
  • 按F5
  • 点击特殊
  • 选择“公式”(或“常数”)下的“错误”

enter image description here

请注意,在 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

2
投票

您可以使用 VBA 中的

IsError()
函数以及工作表中的公式。

有关示例,请参阅 http://vbadud.blogspot.com/2007/04/using-vbas-iserror-function.html


0
投票

还有另一种方法可以处理这个问题:将

On Error Resume Next
添加到代码中(通常只需将其放在循环之前)。

如果某个单元格出错,它只会跳过它并移至循环中的下一个元素:)


0
投票

要检查工作表是否有任何错误,您可以使用此功能:

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

请记住将它们都包含在您的模块中。

© www.soinside.com 2019 - 2024. All rights reserved.