Excelで大量のデータを扱うときに「特定の文字列をどこに入力したのか分からない」「特定のキーワードが含まれるセルを探したい」という場面は日常的に発生します。手作業で検索してもよいですが、数千行にも及ぶデータを毎回探すのは非効率です。そんなときに役立つのが ExcelVBAのFindメソッドを使った文字列検索 です。
この記事では「vba 文字列検索 find」をテーマに、基本的な使い方から複数セルの検索、実務で使える応用例までを徹底解説します。初心者でも分かりやすい手順説明とコード例を用意していますので、ぜひ業務効率化に役立ててください。
目次
✅ Findメソッドの基本
・Findメソッドの構文
Findメソッドは、指定範囲から特定の文字列を検索し、そのセルを返す機能を持ちます。
Set 検索結果Range = 検索範囲.Find(What:="検索文字列", LookAt:=xlPart)
主要な引数は次の通りです。
- What … 検索文字列
- LookAt … 部分一致(xlPart)か完全一致(xlWhole)
- MatchCase … 大文字小文字を区別するかどうか
- SearchOrder … 行単位で探すか列単位で探すか
・最初の一致セルを取得する例
Sub FindFirstCell()
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
✅ 完全一致と部分一致を指定する
・完全一致検索
セルの内容全体と完全に一致する場合だけヒットさせたい場合は LookAt:=xlWhole を指定します。
参考:【VBA】Findを使って完全一致検索を行う方法|LookAt:=xlWholeの実務活用例
Set rng = Range("A1:A100").Find(What:="A1001", LookAt:=xlWhole)
・部分一致検索
セルの一部に検索文字列が含まれていればヒットさせたい場合は LookAt:=xlPart を使います。
Set rng = Range("A1:A100").Find(What:="りんご", LookAt:=xlPart)
✅ 複数セルを検索する(FindNext)
・FindNextを使った繰り返し検索
Findは最初の一致セルしか返さないため、複数一致セルを探すにはFindNextを組み合わせます。
Sub FindAllCells()
Dim rng As Range
Dim firstAddress As String
With Range("A1:A100")
Set rng = .Find(What:="りんご", 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
手順
- 最初の一致セルを取得し、そのアドレスを保存。
FindNextで次の一致セルを順に探す。- 最初のセルに戻るまで繰り返す。
✅ 実務で役立つFindの応用例
・一致セルを色付けする
Sub HighlightMatches()
Dim rng As Range, 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 CopyMatchedRows()
Dim rng As Range, wsOut As Worksheet
Dim firstAddress As String, rowOut As Long
Set wsOut = Sheets("抽出結果")
rowOut = 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(rowOut)
rowOut = rowOut + 1
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致件数を数える
Sub CountMatches()
Dim rng As Range, 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
✅ Findを使うときの注意点
・Nothing判定を忘れない
検索結果が見つからない場合は Nothing になるため、判定を必ず入れる必要があります。
・検索条件の引き継ぎに注意
Findは最後に使った条件を保持しているため、常に引数を明示的に指定することが推奨されます。
・大文字小文字の扱い
MatchCase:=True を指定すると、大文字小文字を区別した検索になります。
・処理速度
数千行~数万行の検索でも高速に処理できるのがFindの強みです。
✅ Findと他の検索方法の違い
- Find:高速。セル単位で検索してセルを返す。
- InStr:セル内の文字列中で検索対象が含まれる位置を返す。
- ループ+If:柔軟だが処理は遅め。複雑条件に向いている。
実務では 基本はFind、細かい条件はInStrやループで補完 という使い分けがおすすめです。
参考:【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)
■ まとめ:VBAでFindを使った文字列検索をマスターしよう
Findはセル検索を自動化できる便利なメソッド。- 完全一致は
LookAt:=xlWhole、部分一致はLookAt:=xlPart。 - 複数セルを検索するときは
FindNextを利用する。 - 実務では「色付け」「コピー」「件数カウント」と組み合わせると効果的。
- Nothing判定や検索条件の引き継ぎに注意する。
ExcelVBAでFindをマスターすれば、大量データの中から必要な情報を正確かつ高速に抽出でき、日常業務の効率化につながります。ぜひ本記事のサンプルを活用して、自分の作業を自動化してみてください。