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

【VBA】文字列を検索する方法|Findメソッドで部分一致・複数一致まで徹底解説

Excel VBAで「文字列を検索する」処理は、業務自動化に欠かせない基本テクニックです。大量のデータから特定の文字を探したり、条件に合うセルを抽出したり、複数箇所を順番に処理したりする場面は、日常業務で非常に多く発生します。

しかし、VBAの検索機能「Findメソッド」は、慣れないと動作が読みにくく、「見つからない」「ループが終わらない」「部分一致になってしまう」など、トラブルが発生しやすい構造になっています。

本記事では、Findメソッドの基本構文から、部分一致・完全一致の使い分け、複数結果の取得方法、検索が失敗する理由、実務での注意点まで、分かりやすく丁寧に解説します。
背景・理由・応用パターンを含め、初心者から中級者まで役立つ内容に仕上げています。

✅ VBAで文字列を検索する方法は「Findメソッド」が中心

・Findメソッドとは

Findメソッドは、指定した文字列に一致するセルを検索し、見つかったセル(Rangeオブジェクト)を返す機能です。

最もよく使われる基本構文は次のとおりです。

Set c = Range("A:A").Find(What:="検索文字", LookAt:=xlPart)

・Findの特徴

  • 検索条件が柔軟(部分一致・完全一致)
  • 見つかったセルをオブジェクトとして取得できる
  • 一発検索だけでなく複数ヒットにも対応
  • LookAt・LookIn など細かい設定が可能

“文字列を検索する” という操作をする場合、
最優先で使うべきVBAの機能 です。


✅ Findメソッドの基本構文と各引数の意味

・Findメソッドの構文

Range.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase)

・主要引数の解説

引数意味よく使う設定
What検索する文字列"田中"
LookAt一致条件xlPart(部分一致)、xlWhole(完全一致)
LookIn検索対象xlValues(値)、xlFormulas(数式)
MatchCase大文字・小文字の区別True / False

・部分一致と完全一致の違い

部分一致:

LookAt:=xlPart

完全一致:

LookAt:=xlWhole

「田中」を含むセルをすべて探したい場合は部分一致が適しています。


✅ 実務で使うFindの基本例(最初の1件だけ取得)

・最初に見つかったセルを取得する方法

Dim c As Range
Set c = Range("A:A").Find("東京")

If Not c Is Nothing Then
    MsgBox "見つかった場所:" & c.Address
Else
    MsgBox "見つかりませんでした"
End If

・ポイント

  • 見つからなかった場合は Nothing が返る
  • 見つかった場合はそのセルのアドレスが取得できる

後続処理への応用がしやすい書き方です。

参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells


✅ 複数の検索結果をループで取得する方法(実務必須)

Findは1件目だけでなく、複数の一致を順番に取得できます。

・複数検索の完全版コード

Dim c As Range
Dim firstAddress As String

Set c = Range("A:A").Find(What:="東京", LookAt:=xlPart)

If Not c Is Nothing Then
    firstAddress = c.Address

    Do
        Debug.Print c.Address & " にヒットしました"
        Set c = Range("A:A").FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
End If

・ポイント

  • 最初のセルのアドレスを記録する
  • FindNext で次の一致を取得
  • 同じセルに戻ったら終了

これは 実務でもっとも使われるFindのパターン です。

参考:【VBA】Findを使って複数条件で検索する方法|実務で役立つ応用サンプル


✅ Findが動かない・見つからない理由と対処法

Findは柔軟だがゆえに、次のようなトラブルが起こりがちです。

● ① LookIn が原因

  • 他のマクロの影響で設定が変わる
  • 数式内に検索文字があるのか、表示値にあるのかで結果が変わる

例:

LookIn:=xlValues  '値を見る
LookIn:=xlFormulas '数式を見る

● ② LookAt が原因

部分一致と完全一致を間違えると検索できません。

● ③ セルに全角・半角違いがある

"ABC" と "ABC" は別物です。

● ④ 前回のFindの設定が残っている

Find は“直前の検索条件”を保持するため、
毎回 LookAt / LookIn を明示するのが安全です。


✅ 特定列だけでなく「シート全体」を検索する方法

Dim c As Range
Set c = Cells.Find("合計")

Cells はシート全体を意味します。

ただし、不要に範囲が広いと検索速度が遅くなるため、
業務マクロでは 対象範囲を限定する のがおすすめです。


✅ 大量データで高速検索したいときのポイント

  • Findの範囲を必要最小限にする
  • ScreenUpdatingを切る
  • Application.Calculationを手動にする
  • LookIn / LookAt を明示する
  • Afterの設定で次のセルから検索させる

単純なコードでも、これらの対策で速度が大きく変わります。


✅ 部分一致・前方一致・後方一致の実務的な使い分け

・部分一致

あいまい検索に向く
例:含む、含まない判定

・前方一致(Like または Left関数などで再現)

例:「ABC123」の “ABC” を探す

・後方一致(Right関数で再現)

例:顧客コードの末尾が一致するか探す

Findだけでなく、Like と組み合わせると柔軟な検索が可能になります。

参考:【VBA】Excelシート全体の置換を自動化する方法|部分一致・完全一致まで徹底解説


✅ 検索結果をリスト化する(実務で最も便利)

複数の検索結果をまとめて別シートに出力することもできます。

Dim c As Range, firstAddress As String
Dim r As Long: r = 1

Set c = Range("A:A").Find("東京", LookAt:=xlPart)

If Not c Is Nothing Then
    firstAddress = c.Address
    Do
        Sheets("検索結果").Cells(r, 1).Value = c.Value
        r = r + 1

        Set c = Range("A:A").FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
End If

実務では
「検索結果一覧を作りたい」
という需要が多く、この形は非常に重宝します。


✅ RPA(UiPath)とFindメソッドの相性

UiPathを使ってExcelを扱う場合、
Findメソッドを含むVBAを先に実行して「検索結果セル」を返すことで、
RPAの処理を安定化させることができます。

  • RPAは大量データの検索が苦手
  • セルを1件ずつ探すと動作が遅い
  • LookAt / LookIn の柔軟性が低い

そのため現場では

✔ “検索だけVBAで実施し、結果をRPAに渡す”

というハイブリッド運用がよく採用されます。


✅ まとめ:Findメソッドを使いこなすと業務効率が大幅に上がる

  • FindメソッドはVBAで文字列検索する中心的な手法
  • 部分一致/完全一致を明示することが重要
  • LookIn/LookAt を指定しないと結果が安定しない
  • 複数一致は FindNext とループで処理
  • Findが見つからない原因は設定ミスが多い
  • 大量データは範囲を絞ると高速化できる
  • 検索結果の一覧化で実務効率が大きく向上
  • RPAと組み合わせると業務自動化で強力な武器になる

Findメソッドは“使いこなすほど価値が上がるVBAの基本技能”です。
ぜひ本記事を参考に、文字列検索の精度と業務効率を高めてみてください。

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