Excelでデータを扱う際に「特定の値と完全に一致するセルを探したい」というニーズは多くあります。例えば、顧客ID「A1001」だけを検索したいのに、部分一致で「A10011」「A10012」までヒットしてしまうのは避けたいところです。そんなときに有効なのが、VBAのFindメソッドで 完全一致検索(LookAt:=xlWhole) を使う方法です。
この記事では「vba find 完全一致」をテーマに、Findメソッドを使った完全一致検索の基本から、複数セルを扱う方法、応用的な実務コードまで詳しく解説します。初心者でも実務で活用できるように、操作手順や注意点を丁寧に説明していきます。
目次
✅ Findメソッドで完全一致検索を行う基本
・Findメソッドの基本構文
Findメソッドは、Excelの検索機能をVBAで呼び出すものです。LookAt引数を xlWhole にすることで、セルの内容が検索文字列と 完全一致するセルだけ を探し出せます。
Sub FindExactMatch()
Dim rng As Range
Set rng = Range("A1:A100").Find(What:="A1001", LookAt:=xlWhole)
If Not rng Is Nothing Then
MsgBox "見つかったセル:" & rng.Address & " 値=" & rng.Value
Else
MsgBox "該当データはありません"
End If
End Sub
手順
- 検索範囲を指定(例:
A1:A100)。 FindメソッドのWhat引数に検索する文字列を指定。LookAt:=xlWholeを設定し、完全一致で検索。- 見つかったセルがあれば、そのセルのアドレスや値を取得。
参考:【VBA】Findメソッド:基本構文と使用例
補足
xlPartに設定すると部分一致になる。rng Is Nothingの判定を必ず入れておくことで、該当データがない場合のエラーを防げます。
✅ 完全一致と部分一致の違いを理解する
・部分一致(xlPart)の場合
「A1001」を検索すると「A1001」「A10011」「A10012」など、先頭や一部に含まれるものもヒットします。
・完全一致(xlWhole)の場合
「A1001」を検索した場合は「A1001」のみがヒットし、余分なデータは対象外になります。
実務では「商品コード」「社員番号」「取引先ID」など、一文字違っても別データとして扱う項目 では必ず xlWhole を指定する必要があります。
✅ 複数セルを完全一致で取得する方法
・FindNextを使った複数検索
Find は最初の一致セルしか返さないため、複数一致セルを取得するには FindNext を組み合わせます。
Sub FindAllExactMatches()
Dim rng As Range
Dim firstAddress As String
With Range("A1:A100")
Set rng = .Find("A1001", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
Debug.Print "ヒット:" & rng.Address & " 値=" & rng.Value
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
この方法なら、同じ値を持つ複数セルを一括で処理できます。
✅ 完全一致検索したセルを処理する実務サンプル
・一致セルを色付けする
Sub HighlightExactMatches()
Dim rng As Range
Dim firstAddress As String
With Range("A1:A100")
Set rng = .Find("完了", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
rng.Interior.Color = vbYellow
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致セルの行全体をコピーする
Sub CopyExactMatches()
Dim rng As Range
Dim wsOut As Worksheet
Dim r As Long
Set wsOut = Sheets("抽出結果")
r = 1
With Range("A1:A100")
Set rng = .Find("重要", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
rng.EntireRow.Copy wsOut.Rows(r)
r = r + 1
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致セルの件数を数える
Sub CountExactMatches()
Dim rng As Range
Dim firstAddress As String
Dim cnt As Long
cnt = 0
With Range("A1:A100")
Set rng = .Find("未処理", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
cnt = cnt + 1
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
MsgBox "完全一致の件数:" & cnt
End Sub
✅ 注意点とエラー対策
・Nothing判定を必ず入れる
一致しなかった場合は Nothing が返るため、そのまま処理するとエラーになります。
・大文字小文字の区別
既定では区別しませんが、MatchCase:=True を指定すれば区別ありの検索が可能です。
Set rng = Range("A1:A100").Find(What:="Apple", LookAt:=xlWhole, MatchCase:=True)
・検索方向と開始位置
SearchOrder や After の指定によって検索結果が変わることがあります。大量データでは検索範囲を意識しましょう。
・Findを繰り返し使う場合の注意
一度設定した検索条件が次回以降にも引き継がれるため、意図せぬ結果を防ぐためには必ず引数を明示するのが安全です。
■ まとめ:Findで完全一致検索を自在に使いこなそう
FindメソッドにLookAt:=xlWholeを指定すれば完全一致検索ができる。FindNextを組み合わせれば複数セルを処理可能。- 実務では「色付け」「行コピー」「件数カウント」などと組み合わせると便利。
Nothing判定、大文字小文字の扱い、検索条件の引き継ぎに注意する。
ExcelVBAで完全一致検索をマスターすれば、大量データから必要な情報だけを正確に取り出せるようになり、業務効率化が大きく進みます。ぜひご自身の仕事の中で活用してみてください。