Excelで大量のデータを扱っていると、特定の文字列がどのセルに存在するのかを調べたい場面が多くあります。顧客名や商品コードをリストの中から探し出したり、コメントに含まれる特定キーワードの位置を確認したりと、実務に直結するニーズです。手作業で検索してもよいのですが、繰り返し行う処理ならばExcelVBAで自動化してしまうのが最も効率的です。
この記事では「vba 文字列検索 セル 位置」をテーマに、セル内やシート全体から文字列を検索し、位置を取得する方法を徹底解説します。初心者でも理解しやすい基本的な書き方から、実務で役立つ応用コードまで丁寧に説明していきます。
目次
✅ VBAで文字列検索を行う基本的な考え方
ExcelVBAで文字列を検索してセルの位置を取得する方法は、大きく分けて次の3種類があります。
- Findメソッド:シート内から文字列を検索し、セルを直接取得する
- InStr関数:セル内の文字列の中で、検索対象が何文字目にあるかを調べる
- ループ+If:すべてのセルを順番に確認して一致を判定する
それぞれの方法に得意・不得意があるため、用途に合わせて選ぶことが重要です。
✅ Findメソッドでセルの位置を取得する
・Findメソッドの基本構文
Range.Find は、指定した範囲の中から検索条件に一致するセルを探し出すメソッドです。検索結果は Range オブジェクトとして返されるので、そのまま位置を取得できます。
Sub FindCellPosition()
Dim rng As Range
Set rng = Range("A1:A100").Find(What:="りんご", LookAt:=xlWhole)
If Not rng Is Nothing Then
MsgBox "見つかった位置:" & rng.Address
Else
MsgBox "該当データはありません"
End If
End Sub
手順
- 検索する範囲を指定(例:
A1:A100)。 Findメソッドで検索キーワードを指定。- 一致するセルがあれば、そのセルのアドレスを返す。
理由
Find はExcelの検索機能をVBAから呼び出しているため、非常に高速で効率的です。大量データの中から特定の文字列を探す場合に最適です。
・複数ヒットを探す方法(FindNextの利用)
Find は最初の一致セルしか返さないため、複数セルを探すには FindNext を組み合わせます。
Sub FindAllCells()
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
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
このようにすれば「りんご」を含むセルをすべて取得できます。
参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells
✅ InStr関数でセル内の文字列位置を調べる
・InStr関数の基本
InStr は、文字列の中で検索したい文字が 何文字目にあるか を返す関数です。セル内の部分一致検索に非常に便利です。
参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法
Sub CheckInStr()
Dim txt As String
txt = Range("A1").Value
If InStr(txt, "りんご") > 0 Then
MsgBox "りんごは " & InStr(txt, "りんご") & " 文字目にあります"
End If
End Sub
手順
- セルの値を文字列として変数に格納。
InStrを使って検索対象の文字列が含まれる位置を取得。- 戻り値が0なら「含まれていない」、1以上ならその位置を示す。
実務での活用
たとえば商品説明文に特定キーワードが含まれているかを調べたり、入力チェックに使ったりできます。
✅ For Each+Ifで全セルをチェックする
・シンプルなループ検索
For Each を使って範囲内のセルをすべて確認し、条件に一致したら処理を行う方法です。
参考:【VBA】For Each を使ったセル範囲の操作方法
Sub LoopSearch()
Dim c As Range
For Each c In Range("A1:A100")
If c.Value = "りんご" Then
Debug.Print "一致セル:" & c.Address
End If
Next c
End Sub
・部分一致を判定する
If InStr(c.Value, "りんご") > 0 Then
Debug.Print "一致セル:" & c.Address
End If
理由
Findより処理速度は遅いですが、条件を柔軟に組み合わせられるのが強みです。数値との比較や複数条件を判定するときに便利です。
✅ 実務で役立つ応用例
・一致セルを色付けする
Sub HighlightMatches()
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 ExportMatches()
Dim c As Range
Dim ws As Worksheet
Dim rowOut As Long
Set ws = Sheets("結果")
rowOut = 1
For Each c In Range("A1:A100")
If InStr(c.Value, "りんご") > 0 Then
ws.Cells(rowOut, 1).Value = c.Value
ws.Cells(rowOut, 2).Value = c.Address
rowOut = rowOut + 1
End If
Next c
End Sub
・一致セルの行全体をコピー
Sub CopyMatchedRows()
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
✅ 注意点とエラー対策
- FindのNothing判定を忘れない
一致しない場合はNothingが返るため、必ず判定を入れる。 - 部分一致と完全一致の違いに注意
- 完全一致 →
LookAt:=xlWhole - 部分一致 →
LookAt:=xlPart
- 完全一致 →
- 大文字小文字の区別
MatchCase:=Trueを指定すると区別あり。
- ループ処理の速度に注意
- 数万行規模では
Findを使った方が高速。
- 数万行規模では
■ まとめ:VBAで文字列検索とセル位置取得をマスターしよう
Findを使えばシート全体から高速に検索でき、セルの位置を直接取得できる。InStrはセル内での文字列の位置を調べるのに便利。For Each+Ifは処理速度は落ちるが複雑条件に強い。- 実務では「色付け」「別シートへの出力」「行コピー」などと組み合わせると効率的。
ExcelVBAで文字列検索とセル位置取得をマスターすれば、大量データの中から必要な情報を瞬時に抽出し、業務効率を飛躍的に高めることができます。ぜひ日々の業務に活用してみてください。