如何通过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中的错误,那么你应该寻找一个非常有效的方法 – 看每个单元是非常昂贵的时间明智的!
这两个选项是:
- 使用Excel的SpecialCells快捷进程
- 使用我的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
(通常只是把它放在循环之前)。
如果一个单元格是一个错误,它会跳过它,并移动到循环中的下一个元素:)