最も効率的な方法が必要な場合は、低速範囲ループを回避するこのアプローチを試すことができます
SpecialCells
数式のループにエラーが含まれています (他の解決策による)
Find
(1) のすべてのセルを単純にループするのではなく、特定の数式を検出するために使用します。
このコードはR1C1
メソッドを使用して にフィードするFind
ため、コードは必要に応じてこのApplication
設定を変更します (その後、最後に戻ります)。
見つけたい数式を記録してから入力することをお勧めします。R1C1
表記法の大きな利点は、実際の行と列の位置にとらわれないことです。
たとえば、A1
表記法では
- =SUM(A1:A4) in では、 B5`
A5
に対して別の検索が必要になります。SUM(B1:B4) in
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