我有一个电子表格,其中包含许多请求数据的函数调用。我正在编写一个函数(在VBA中)来检查是否有任何单元格包含错误值“#VALUE”等。
目前我逐行逐列迭代并首先检查单元格是否包含公式,如果是,则检查instr为“#VALUE”,“#N / A”等。
但是,我想知道是否可以更快地模拟在Excel中单击整列,然后在VBA中“ctrl + f”获取值....
最有效的方法是什么?我正在检查一张27列×1200行大的表。
编辑我刚刚意识到有一些单元格有“#N / A”,这是因为它们不包含特定的公式。我只需要搜索包含特定公式的单元格......这可能吗?EDIT2我实际上需要记录一个返回resutls的宏,就像“find all”一样。我使用了“find”,我可以得到一个布尔值,但“找到所有”并没有记录任何VBA代码....
答案 0 :(得分:6)
您可以使用SpecialCells
仅返回包含错误的单元格。
Sub Demo()
Dim sh As Worksheet
Dim rng As Range, cl As Range
For Each sh In ActiveWorkbook.Worksheets
Set rng = Nothing
On Error Resume Next
Set rng = sh.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If rng Is Nothing Then
Debug.Print "No Errors"
Else
For Each cl In rng
If cl.Formula Like "*" Then ' <-- replace * with your criteria
Debug.Print cl.Address
End If
Next
End If
Next
End Sub
答案 1 :(得分:1)
鉴于您想要最有效的方法,您可以尝试这种避免慢速循环的方法
SpecialCells
公式chichi包含错误(根据其他解决方案)Find
检测特定公式,而不是通过(1)中每个单元格的简单循环此代码使用R1C1
方法输入Find
,以便代码在必要时更改此Application
设置(然后返回结尾)
我建议你记录你想要找到的公式然后输入。R1C1
表示法的一大优点是它与实际的行和列位置无关。
例如,在A1
表示法中的公式为
A5
中的SUM(A1:A4)需要对SUM(B1:B4) in
B5进行不同的搜索R1C1
=SUM(R[-4]C:R[-1]C)
这两种情况<强>码强>
Sub Demo()
Dim ws As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim strAddress As String
Dim bRefSTyle
If Application.ReferenceStyle = xlA1 Then
Application.ReferenceStyle = xlR1C1
bRefSTyle = True
End If
For Each ws In ActiveWorkbook.Worksheets
Set rng1 = Nothing
On Error Resume Next
Set rng1 = ws.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If rng1 Is Nothing Then
Debug.Print ws.Name & ": No Formulae errors"
Else
'search errors for particular formula
'this sample looks for a formula which SUMS the four cells directly above it
Set rng2 = rng1.Find("=SUM(R[-4]C:R[-1]C)", , xlFormulas, xlWhole)
If Not rng2 Is Nothing Then
strAddress = rng2.Address
Set rng3 = rng2
Do
Set rng2 = rng1.Find("=SUM(R[-4]C:R[-1]C)", rng2, xlFormulas, xlWhole)
Set rng3 = Union(rng2, rng3)
Loop While strAddress <> rng2.Address
Debug.Print ws.Name & ": " & rng3.Address
Else
Debug.Print ws.Name & ": error cells, but no formulae match"
End If
End If
Next
'restore styles if necessary
If bRefSTyle Then Application.ReferenceStyle = xlA1
End Sub