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

【VBA】文字列検索を部分一致で行う方法|Find・InStr・ループを使った実務サンプル

Excelを使っていると、セルに含まれる文字列が「完全一致」ではなく「部分一致」するケースで検索をしたいことがよくあります。たとえば「りんごジュース」「青りんご」「りんごケーキ」など、セルの一部に「りんご」が含まれている行を探したい場合です。手作業でフィルターや検索を行うこともできますが、繰り返し使う処理ならExcelVBAで自動化するのが効率的です。

この記事では「vba 文字列検索 部分一致」というテーマで、ExcelVBAでセルを対象に部分一致検索を行い、セルや行を取得して処理する方法を詳しく解説します。初心者でもわかるように基本的なコードから、実務で使える応用例まで幅広く紹介していきます。

✅ VBAで文字列検索を部分一致で行う基本の考え方

部分一致の文字列検索をVBAで行う方法は主に3種類あります。

  1. Findメソッド+LookAt:=xlPart を使う方法
  2. InStr関数 を使って文字列内の位置を判定する方法
  3. For Each+If を組み合わせてセルを走査する方法

それぞれの方法に特徴があるため、場面に応じて最適な手段を選ぶことが重要です。


✅ Findメソッドで部分一致検索する

・Findメソッドの基本構文

Range.Find はセルを検索する標準的な方法で、LookAt 引数を xlPart にすることで部分一致検索が可能になります。

Sub FindPartial()
    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. Find の引数 What に検索文字列を指定。
  3. LookAt:=xlPart を設定し、部分一致で検索。
  4. 見つかったセルを返す。

    参考:【VBA】Findメソッド:基本構文と使用例

補足

  • 完全一致にしたい場合は xlWhole を使う。
  • 見つからない場合は Nothing になるため判定が必須。

・複数セルを部分一致で取得(FindNextを利用)

Sub FindAllPartial()
    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

このコードを使えば、セルの一部に「りんご」を含むものをすべて取得できます。


✅ InStr関数でセル内の文字列を調べる

・InStr関数の基本

InStr 関数は、文字列内で検索対象が含まれているかどうかを調べる関数です。
0より大きい値を返せば「部分一致している」という判定になります。

Sub CheckPartialWithInStr()
    Dim txt As String
    txt = Range("A1").Value
    
    If InStr(txt, "りんご") > 0 Then
        MsgBox "セル内に「りんご」を含みます"
    End If
End Sub

理由

InStrは部分一致検索の判定に最適で、セル内に含まれる位置まで確認できるため柔軟性があります。

参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法


・複数セルをInStrで判定する

Sub LoopWithInStr()
    Dim c As Range
    For Each c In Range("A1:A100")
        If InStr(c.Value, "りんご") > 0 Then
            Debug.Print "ヒット:" & c.Address & " 値=" & c.Value
        End If
    Next c
End Sub

✅ For Each+Ifで部分一致判定

・ループで判定する方法

シンプルに For Each を使ってセルを走査し、部分一致を判定する方法です。
InStr と組み合わせて利用するのが一般的です。

Sub ForEachPartial()
    Dim c As Range
    For Each c In Range("A1:A100")
        If InStr(c.Value, "りんご") > 0 Then
            c.Interior.Color = vbYellow
        End If
    Next c
End Sub

補足

この方法はFindより処理速度は遅いですが、複雑な条件分岐を追加しやすいメリットがあります。

参考:【VBA】セルに特定の文字が入っていた場合にIF文で複数条件を処理する方法


✅ 実務で役立つ応用サンプル

・一致セルを色付けする

Sub HighlightPartial()
    Dim c As Range
    For Each c In Range("A1:A100")
        If InStr(c.Value, "りんご") > 0 Then
            c.Interior.Color = vbYellow
        End If
    Next c
End Sub

・一致セルを別シートへコピー

Sub CopyPartialMatches()
    Dim c As Range
    Dim wsOut As Worksheet
    Dim r As Long
    
    Set wsOut = Sheets("抽出結果")
    r = 1
    
    For Each c In Range("A1:A100")
        If InStr(c.Value, "りんご") > 0 Then
            c.EntireRow.Copy wsOut.Rows(r)
            r = r + 1
        End If
    Next c
End Sub

・一致セルの件数をカウント

Sub CountPartialMatches()
    Dim c As Range
    Dim cnt As Long
    cnt = 0
    
    For Each c In Range("A1:A100")
        If InStr(c.Value, "りんご") > 0 Then
            cnt = cnt + 1
        End If
    Next c
    
    MsgBox "「りんご」を含むセル数:" & cnt
End Sub

■ 注意点とエラー対策

  1. FindはNothing判定必須
    一致セルがない場合にエラーにはならないが、Nothing を返すので判定が必要。
  2. 大文字小文字の違い
    • InStr では既定で大文字小文字を区別しない。
    • 区別したい場合は vbBinaryCompare を指定する。
  3. ループ処理の速度
    数万行規模では Find の方が高速。
  4. 部分一致の曖昧さに注意
    「りんご」と検索すると「青りんご」もヒットする。必要に応じて正規表現を利用することも検討。

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

  • FindLookAt:=xlPart で高速に部分一致検索できる。
  • InStr を使えばセル内の位置まで調べられ、柔軟性が高い。
  • For Each+If は処理は遅めだが複雑条件の判定に向いている。
  • 実務では「色付け」「コピー」「件数カウント」などと組み合わせると便利。

ExcelVBAで部分一致検索をマスターすれば、大量のデータから必要な情報を効率的に抽出でき、日常業務のスピードと正確性が大幅に向上します。ぜひご自身の業務に取り入れてみてください。

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