Excel VBAでよく使われる検索処理のひとつに「Findメソッド」があります。
セルの中から特定の値を探す時にとても便利ですが、使い方によっては正しく動作しなかったり、ループで全ての該当セルを探し出すのが難しかったりします。
この記事では、Findメソッドの基本的な使い方から、複数ヒットを取得する応用的な使い方までを解説します。実務に活かせるVBAコード付きでご紹介していきますので、ぜひ最後までお読みください。
Findメソッドとは?
VBAのFindメソッドは、指定した範囲内で特定の値を検索するための関数です。
Excelの「検索」機能と同じように動作し、条件に一致するセルを1つ返します。
Set 検索結果 = 範囲.Find(検索値, 検索開始位置, 検索方向, 比較方法, 検索の種類)
主な引数の意味
引数 | 説明 |
---|---|
What | 検索する値(必須) |
After | 検索を開始するセル。ここから検索を開始(Afterの次のセルから探す) |
LookIn | 検索対象(xlValues , xlFormulas など) |
LookAt | 完全一致か部分一致か(xlWhole またはxlPart ) |
SearchOrder | 検索方向(xlByRows またはxlByColumns ) |
SearchDirection | 検索順(xlNext またはxlPrevious ) |
MatchCase | 大文字と小文字を区別するか(True またはFalse ) |
基本的なFindの使い方
以下は、A列の中から「東京」という文字列を検索する基本的なコードです。
Sub FindSample()
Dim ws As Worksheet
Dim foundCell As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set foundCell = ws.Range("A:A").Find(What:="東京", LookIn:=xlValues, LookAt:=xlWhole)
If Not foundCell Is Nothing Then
MsgBox "見つかりました!セルのアドレス: " & foundCell.Address
Else
MsgBox "見つかりませんでした。"
End If
End Sub
複数ヒットのFindNextによる検索方法
Findメソッドは最初の1件しか返さないため、複数の一致セルを探す場合はFindNext
を使ってループする必要があります。
Sub FindAllMatches()
Dim ws As Worksheet
Dim firstAddress As String
Dim foundCell As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set foundCell = ws.Range("A:A").Find("東京", LookIn:=xlValues)
If Not foundCell Is Nothing Then
firstAddress = foundCell.Address
Do
MsgBox "見つかりました: " & foundCell.Address
Set foundCell = ws.Range("A:A").FindNext(foundCell)
Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
Else
MsgBox "該当データが見つかりません。"
End If
End Sub
Findを使う時の注意点
1. After引数の罠
After
で指定したセル「の次のセル」から検索が始まります。AfterをRange("A1")
にすると、A1
自体は検索対象になりません。
2. Findの設定は保持される
Findの設定は、前回の検索設定がExcelに保持される仕様です。
LookInやLookAtは明示的に指定しましょう。
3. 大文字小文字の区別
MatchCase:=Trueを指定すると、「東京」と「東京」は一致しますが、「東京」と「TOKYO」は一致しません。
条件付きのFind(部分一致・大文字小文字区別など)
Sub FindPartialMatch()
Dim ws As Worksheet
Dim result As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set result = ws.Range("A:A").Find(What:="京", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
If Not result Is Nothing Then
MsgBox "見つかりました: " & result.Address
End If
End Sub
複数列・全シートを対象に検索する
ワークシート全体を検索
Sub FindInAllSheets()
Dim ws As Worksheet
Dim foundCell As Range
For Each ws In ThisWorkbook.Sheets
Set foundCell = ws.UsedRange.Find("東京", LookIn:=xlValues)
If Not foundCell Is Nothing Then
MsgBox "シート '" & ws.Name & "' にて発見: " & foundCell.Address
End If
Next ws
End Sub
見つけたセルの隣の値を取得する例
Sub GetNextColumnValue()
Dim foundCell As Range
Set foundCell = Sheet1.Range("A:A").Find("東京", LookIn:=xlValues)
If Not foundCell Is Nothing Then
MsgBox "隣のセルの値: " & foundCell.Offset(0, 1).Value
End If
End Sub
Findの代わりに使えるMatchとの違い
機能 | Findメソッド | Match関数 |
---|---|---|
一致条件 | 完全一致 / 部分一致 | 完全一致 / 近似一致 |
複数ヒット | FindNextで対応 | 1件のみ |
対象範囲 | セル範囲なら柔軟に対応可能 | 行や列 |
結果 | Range型 | 数値(位置) |
まとめ
Findメソッドは、Excel VBAで効率的な検索を行うために欠かせない機能です。
基本的な使い方を覚えておけば、業務での作業効率が格段に上がります。
特に、複数の一致を探す場合にはFindNext
との組み合わせが重要です。
Excelの検索機能に頼るだけでなく、VBAで自動化することで、より柔軟で強力な処理が可能になります。ぜひ、この記事を参考にFindメソッドをマスターしてください!