Excelを使っていると、セルに含まれる文字列が「完全一致」ではなく「部分一致」するケースで検索をしたいことがよくあります。たとえば「りんごジュース」「青りんご」「りんごケーキ」など、セルの一部に「りんご」が含まれている行を探したい場合です。手作業でフィルターや検索を行うこともできますが、繰り返し使う処理ならExcelVBAで自動化するのが効率的です。
この記事では「vba 文字列検索 部分一致」というテーマで、ExcelVBAでセルを対象に部分一致検索を行い、セルや行を取得して処理する方法を詳しく解説します。初心者でもわかるように基本的なコードから、実務で使える応用例まで幅広く紹介していきます。
目次
✅ VBAで文字列検索を部分一致で行う基本の考え方
部分一致の文字列検索をVBAで行う方法は主に3種類あります。
- Findメソッド+LookAt:=xlPart を使う方法
- InStr関数 を使って文字列内の位置を判定する方法
- 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
手順
- 検索範囲を指定(例:
A1:A100)。 Findの引数Whatに検索文字列を指定。LookAt:=xlPartを設定し、部分一致で検索。- 見つかったセルを返す。
補足
- 完全一致にしたい場合は
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
■ 注意点とエラー対策
- FindはNothing判定必須
一致セルがない場合にエラーにはならないが、Nothingを返すので判定が必要。 - 大文字小文字の違い
InStrでは既定で大文字小文字を区別しない。- 区別したい場合は
vbBinaryCompareを指定する。
- ループ処理の速度
数万行規模ではFindの方が高速。 - 部分一致の曖昧さに注意
「りんご」と検索すると「青りんご」もヒットする。必要に応じて正規表現を利用することも検討。
■ まとめ:VBAで部分一致検索を自在に使いこなそう
Find+LookAt:=xlPartで高速に部分一致検索できる。InStrを使えばセル内の位置まで調べられ、柔軟性が高い。For Each+Ifは処理は遅めだが複雑条件の判定に向いている。- 実務では「色付け」「コピー」「件数カウント」などと組み合わせると便利。
ExcelVBAで部分一致検索をマスターすれば、大量のデータから必要な情報を効率的に抽出でき、日常業務のスピードと正確性が大幅に向上します。ぜひご自身の業務に取り入れてみてください。