VBAで自動化 VBA一覧 抽出・検索処理 検索・Findメソッド

【VBA】Findを使って完全一致検索を行う方法|LookAt:=xlWholeの実務活用例

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

手順

  1. 検索範囲を指定(例:A1:A100)。
  2. FindメソッドのWhat引数に検索する文字列を指定。
  3. LookAt:=xlWholeを設定し、完全一致で検索。
  4. 見つかったセルがあれば、そのセルのアドレスや値を取得。
    参考:【VBA】Findメソッド:基本構文と使用例

補足

  • xlPart に設定すると部分一致になる。
  • rng Is Nothing の判定を必ず入れておくことで、該当データがない場合のエラーを防げます。

✅ 完全一致と部分一致の違いを理解する

・部分一致(xlPart)の場合

「A1001」を検索すると「A1001」「A10011」「A10012」など、先頭や一部に含まれるものもヒットします。

参考:【VBA】部分一致の処理をする方法:Like演算子

・完全一致(xlWhole)の場合

「A1001」を検索した場合は「A1001」のみがヒットし、余分なデータは対象外になります。

実務では「商品コード」「社員番号」「取引先ID」など、一文字違っても別データとして扱う項目 では必ず xlWhole を指定する必要があります。

参考:【VBA】文字列の完全一致の処理(IF文)


✅ 複数セルを完全一致で取得する方法

・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)

・検索方向と開始位置

SearchOrderAfter の指定によって検索結果が変わることがあります。大量データでは検索範囲を意識しましょう。

・Findを繰り返し使う場合の注意

一度設定した検索条件が次回以降にも引き継がれるため、意図せぬ結果を防ぐためには必ず引数を明示するのが安全です。


■ まとめ:Findで完全一致検索を自在に使いこなそう

  • Findメソッドに LookAt:=xlWhole を指定すれば完全一致検索ができる。
  • FindNext を組み合わせれば複数セルを処理可能。
  • 実務では「色付け」「行コピー」「件数カウント」などと組み合わせると便利。
  • Nothing 判定、大文字小文字の扱い、検索条件の引き継ぎに注意する。

ExcelVBAで完全一致検索をマスターすれば、大量データから必要な情報だけを正確に取り出せるようになり、業務効率化が大きく進みます。ぜひご自身の仕事の中で活用してみてください。

-VBAで自動化, VBA一覧, 抽出・検索処理, 検索・Findメソッド