如何使用Excel VBA确定整个工作簿中的任何单元格中是否存在错误
问:如何使用Excel VBA确定整个工作簿中的任何单元格中是否存在错误 通常情况下,错误将被0或#值错误所除,但此列表并非详尽无遗(或者是吗?-我不知道是否存在更多) 是否有一种方法可以确定单元格是否包含错误,然后跳过脚本中的进一步处理,而不弹出调试/警告/错误消息 诸如此类如何使用Excel VBA确定整个工作簿中的任何单元格中是否存在错误,excel,vba,Excel,Vba,问:如何使用Excel VBA确定整个工作簿中的任何单元格中是否存在错误 通常情况下,错误将被0或#值错误所除,但此列表并非详尽无遗(或者是吗?-我不知道是否存在更多) 是否有一种方法可以确定单元格是否包含错误,然后跳过脚本中的进一步处理,而不弹出调试/警告/错误消息 诸如此类 if value in current.Workbook.cell is error then go to <jump> OR if 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>
如果current.Workbook.cell中的值为错误,则转到
或
如果old.Workbook.cell中的值为错误,则转到
其中,jump
是if statmenet末尾但在循环内的标记
脚本将比较两个工作簿之间的值,并使用颜色更新当前工作簿以显示差异
我根本没有VBA经验。但我明白了剧本的要点
非常感谢。您可以使用VBA中的
IsError()
函数以及工作表中的公式
请参阅以获取示例。您可以使用
VarType
函数跳过有错误的单元格。例如:
If VarType(ActiveCell.Value) <> vbError Then
' do something
End If
如果VarType(ActiveCell.Value)vbError那么
“做点什么
如果结束
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
还有另一种处理方法:在代码中添加
On Error Resume Next
(通常只是放在循环之前)
如果一个单元格是错误的,它只会跳过它并移动到循环中的下一个元素:)如果您最初的问题是如何使用VBA检测工作簿中任何单元格中的错误,那么您应该寻找一种非常有效的方法-查看每个单元格的时间非常昂贵 有两种选择:
Set rng1=ws.Cells.SpecialCells(xlConstants,xlErrors)
来检测这些错误
您还可以通过以下方式手动使用检测特殊单元格:
- 选择感兴趣区域中的所有单元格
- 按F5
- 点击特殊
- 在“公式”(或“常量”)下选择“错误”
我希望忽略(跳过)的可能错误列表#DIV/0#名字#不适用#嗯#裁判#价值非常感谢您,实现了这一点,它似乎已经停止了错误,并允许该过程继续。谢谢您。我假设这需要在每个循环或if语句之前,而不是在文档的开头。我已经把这个加进去了,这很有帮助。谢谢你,在sub或function中只出现一次,它始终有效!我不建议下一步继续出错,因为它将隐藏所有错误,而不仅仅是单元格值出错的地方。对于更复杂的过程,我同意,但如果您所做的只是复制单元格,那么您可以非常确定可能会发生什么错误。我同意最好的方法是对错误进行详细说明,但在错误恢复上,下一步仍然是IMO的几种有效解决方案之一。这并不是我想要的,但谢谢,知道这一点很有用。现在,如果我可以从我的VB中获取错误信息到php脚本中。。。
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