VBA(Excel) で Find メソッドを使う   2008/01/20 (Sun)  00:09  [Programming]

Excel マクロでの検索処理です。

Excel のヘルプ(VBの方)の使用例に少し手を加えたものです。
ソースコード中のコメントでも記載してありますが、検索にヒットするセルが1つしかなく、そのセルが結合セルである場合、ヘルプの使用例のままでは、FindNext の結果が Nothing になるため、Loop While ~ の行でエラーになります。検索にヒットするセルが2つ以上あったり、ヒットするセルが1つでもそのセルが結合セルでなければ問題ありません。

FindNext メソッドは、検索範囲内の最後のセルまで検索すると、検索範囲の最初のセルに戻って再検索を行うため、検索にヒットするセルが1つしかない場合は、同じセルがひたすらヒットするはずなのです。それなのに検索にヒットするセルが1つしかなく、それが結合セルの場合には、再度同じ結合セルが検索にヒットするわけでなく、なぜか Nothing になります。この挙動を本来の FindNext の挙動に合わせるように手を加えています。

ソースコードは以下の通り。
なお、検索結果は該当範囲の左上のセルの位置をイミディエイトウィンドウに出力しています。

Option Explicit

Sub test()
    Dim find_range As Range     '検索範囲
    Dim find_value As String    '検索する値
    Dim find_cell As Range      '検索でヒットした範囲
    Dim prev_find_cell As Range '前回の検索でヒットした範囲
    Dim findAddress As String   '範囲参照値
    
    Set find_range = ActiveSheet.Range("A1:F5") '検索範囲
    find_value = "あ" '検索する値
    
    With find_range
        Set find_cell = .Find(find_value, LookIn:=xlValues)
        If Not find_cell Is Nothing Then
            findAddress = find_cell.Address
            Do
                '検索されたセルの位置をイミディエイトウィンドウに出力
                Debug.Print "(" & find_cell.Column & "," & find_cell.Row & ")"
                
                Set prev_find_cell = find_cell
                Set find_cell = .FindNext(find_cell)
                
                '結合セルのみがヒットするとなぜかNothingになるためそれを回避
                If find_cell Is Nothing Then
                    Set find_cell = prev_find_cell  '前回ヒットしたRangeが唯一の該当Rangeのはず
                    Set prev_find_cell = Nothing
                    Exit Do
                End If
                
            Loop While find_cell.Address <> findAddress
        End If
    End With
    Set find_range = Nothing
End Sub

wikieditish message: Ready to edit this entry.