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

【VBA】Findを使って部分一致検索を行う方法|実務で役立つサンプル付き

Excelでデータを扱う際に「特定の文字列を含むセルを探したい」というニーズは頻繁にあります。たとえば商品名リストの中から「りんご」を含むものを探したい場合、完全一致では「りんご」しかヒットしませんが、部分一致なら「青りんご」「りんごジュース」なども対象になります。

手作業でフィルターを使えば可能ですが、業務で繰り返し行うならVBAで自動化するのが効率的です。その際に便利なのが、Findメソッドを使った 部分一致検索(LookAt:=xlPart) です。

この記事では「vba find 部分一致」をテーマに、基本構文から複数セルの検索、注意点、実務で役立つ応用サンプルまで詳しく解説します。

✅ VBAでFindを使った部分一致検索の基本

・Findメソッドの基本構文

ExcelVBAのFindメソッドは、セル範囲の中から検索値を探すために使用します。部分一致検索をする場合は、LookAt:=xlPartを指定するのがポイントです。

Sub FindPartialMatch()
    Dim rng As Range
    Set rng = Range("A1:A100").Find(What:="りんご", LookAt:=xlPart)
    
    If Not rng Is Nothing Then
        MsgBox "ヒットしたセル:" & rng.Address & " 値=" & rng.Value
    Else
        MsgBox "該当データはありません"
    End If
End Sub

手順

  1. 検索対象の範囲を指定(例:A1:A100)。
  2. FindWhat引数に検索文字列を指定。
  3. LookAt:=xlPartを設定することで部分一致を実行。
  4. 戻り値がNothingかどうかを判定し、セルのアドレスや値を取得。参考:【VBA】Findメソッド:基本構文と使用例

✅ 完全一致との違い

・完全一致(xlWhole)

セル全体の内容が検索値と一致する場合のみ対象。

Set rng = Range("A1:A100").Find("りんご", LookAt:=xlWhole)

→ 「りんご」はヒットするが、「りんごジュース」は対象外。

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

・部分一致(xlPart)

セルの一部に検索値が含まれていれば対象。

Set rng = Range("A1:A100").Find("りんご", LookAt:=xlPart)

→ 「りんご」「りんごジュース」「青りんご」すべてヒット。

実務では商品名やコメント欄などに対して部分一致を使うケースが多いです。

参考:【VBA】文字列の部分一致(IF文)


✅ 複数セルを部分一致で取得する方法

・FindNextを利用する

Findは最初の一致セルしか返さないため、複数セルを取得する場合はFindNextと組み合わせます。

Sub FindAllPartialMatches()
    Dim rng As Range
    Dim firstAddress As String
    
    With Range("A1:A100")
        Set rng = .Find("りんご", LookAt:=xlPart)
        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

実務での活用例

  • 顧客名リストから「株式会社」を含むデータを抽出。
  • 商品名に「限定版」を含む行を一覧化。
  • コメント欄に「確認要」と書かれているセルを探す。

✅ 部分一致検索でよくある「見つからない」問題と対策

・余分なスペース

セルに「りんご 」のように末尾にスペースがあるとヒットしない場合があります。
Trim関数で前後の空白を削除してから検索。

参考:【VBA】スペースを一括で削除【Replace関数:Trim関数】

・大文字小文字の区別

既定では区別しませんが、MatchCase:=Trueを指定すると区別されます。
→ 区別不要なら省略。

参考:【VBA】大文字と小文字を区別しない:LCase・UCase

・検索範囲の指定ミス

範囲外を指定していると当然ヒットしません。
→ 必要に応じて列全体(Range("A:A"))やUsedRangeを使う。

・数値と文字列の違い

「100」と入力されていても、文字列型と数値型の違いで見つからないことがあります。
→ 検索値をCStrで文字列に変換すると改善します。

参考:【VBA】CStr関数:値を文字列に変換する


✅ 部分一致検索の応用サンプル

・一致セルを色付けする

Sub HighlightPartialMatches()
    Dim rng As Range, firstAddress As String
    With Range("A1:A100")
        Set rng = .Find("りんご", LookAt:=xlPart)
        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 CopyPartialMatchRows()
    Dim rng As Range, wsOut As Worksheet
    Dim firstAddress As String, r As Long
    
    Set wsOut = Sheets("抽出結果")
    r = 1
    
    With Range("A1:A100")
        Set rng = .Find("限定", LookAt:=xlPart)
        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 CountPartialMatches()
    Dim rng As Range, firstAddress As String
    Dim cnt As Long
    
    cnt = 0
    With Range("A1:A100")
        Set rng = .Find("確認", LookAt:=xlPart)
        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
 参考:【VBA】Findを使って列を指定して検索する方法|列内検索の基本と応用

✅ 部分一致検索と他の方法の比較

・Findメソッド

  • 高速処理が可能。
  • セル単位で検索できる。
  • 複数セル検索はFindNextが必須。

・InStr関数

  • セル内の位置を返すことが可能。
  • 部分一致判定がシンプルに書ける。
  • 処理はやや遅め。

・ループ+If

  • 柔軟に条件を組み合わせ可能。
  • 条件分岐が複雑な場合に有効。
  • 大量データでは遅くなる。

実務では 基本はFind、必要に応じてInStrやループを併用 するのがおすすめです。

参考:【VBA】条件に合うデータを抽出:For文・IF文


✅ 部分一致検索を安定させるコツ

  1. Nothing判定を必ず入れる
    一致がない場合の処理を明確にする。
  2. 検索条件を明示的に指定する
    LookAtMatchCaseを省略すると前回の設定が残るため、常に明示。
  3. データ前処理を行う
    スペースや全角半角の違いを整えておくと、意図せぬ検索漏れを防げます。
  4. 必要に応じて正規表現を利用する
    高度な部分一致検索をする場合はVBAの正規表現を活用するのも有効です。

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

  • FindLookAt:=xlPart を指定すれば部分一致検索が可能。
  • 複数セルを探すには FindNext を利用する。
  • 実務では「色付け」「コピー」「件数カウント」と組み合わせて効率化できる。
  • スペースや型の違いによる「見つからない」問題に注意する。
  • InStrや正規表現との併用でさらに柔軟な検索が可能。

ExcelVBAで部分一致検索をマスターすれば、大量のデータから目的の情報を正確に抽出でき、日常業務のスピードと精度が大幅に向上します。ぜひ本記事のサンプルを参考に、業務効率化に役立ててみてください。

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