如何通过Excel VBA确定是否在整个工作簿中的任何单元格中出现错误

问:如何确定是否在Excel VBA中的整个工作簿中的任何单元格中出现错误?

通常错误会被除以0或#value的错误,但这个列表不是穷举的(或者是 – 我不知道是否更多的存在)

有没有一种方法来确定单元格是否包含错误,然后跳过我的脚本进一步处理,而不吐出debugging/警告/错误消息。

类似的东西

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 statmenet结尾处的标记,但在循环中。

脚本比较两个工作簿之间的值,并用颜色更新当前工作簿以显示差异。

我根本没有VBA的经验。 但是我得到了我得到的剧本的要点。

非常感谢你。

您可以使用VarType函数跳过出现错误的单元格。 例如:

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

VarType函数对于validation数据types也非常有用。 例如,如果您的代码需要date值,但有时会遇到文本,则可以使用此函数审查数据并正常处理exception。

下面是在立即窗口中logging的代码片段,工作表名称,单元格地址和公式,其中存在电子表格公式错误…

 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中的错误,那么你应该寻找一个非常有效的方法 – 看每个单元是非常昂贵的时间明智的!

这两个选项是:

  1. 使用Excel的SpecialCells快捷进程
  2. 使用我的Mappit! 插件被configuration为报告电子表格错误

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

请注意, 常量也有一个错误集合,所以如果你已经复制,然后在公式错误上运行一个特殊的粘贴值,那么你需要使用Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors)来检测这些

你也可以使用手动检测SpecialCells

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

在这里输入图像说明

请注意,在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代码中添加On Error Resume Next (通常只是把它放在循环之前)。

如果一个单元格是一个错误,它会跳过它,并移动到循环中的下一个元素:)