Excelを使っていて「特定の文字列や数値がどこに入力されているのか分からない」という場面は多くあります。手作業で検索することも可能ですが、データ量が多い場合は効率が悪く、同じ作業を繰り返すとミスの原因にもなります。そんなときに便利なのが ExcelVBAを使って検索し、セルの位置を取得する方法 です。
この記事では「vba 検索 セル位置 取得」をテーマに、基本の検索方法から複数セルの取得、応用的な実務サンプルまで解説します。初心者でも理解できるように、コード例と手順を丁寧に紹介します。
目次
✅ VBAでセル位置を取得する3つの基本手法
・Findメソッド
Excelの検索機能をVBAから利用できるメソッドで、最も高速かつ効率的にセル位置を取得できます。
・InStr関数+ループ
セル内の文字列に対して部分一致の検索を行う方法。柔軟に条件を判定できます。
・For Each+If
すべてのセルを順にチェックして、条件に一致すればセル位置を取得。シンプルで直感的ですが処理はやや遅めです。
✅ Findメソッドでセル位置を取得する
・基本構文
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
手順
- 検索対象範囲を指定。
Findで検索文字列を指定。- 戻り値のRangeオブジェクトからセル位置を取得。
- 一致がなければ
Nothing判定で処理を分ける。
参考:【VBA】Findメソッド:基本構文と使用例
・部分一致で検索する
Set rng = Range("A1:A100").Find(What:="りんご", LookAt:=xlPart)
→ 「青りんご」「りんごジュース」なども対象。
参考:【VBA】文字列の部分一致(IF文)
・複数セルを検索する(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
✅ InStr関数でセル内の位置を取得する
・基本構文
Sub InStrSearch()
Dim txt As String
txt = Range("A1").Value
If InStr(txt, "りんご") > 0 Then
MsgBox "「りんご」は " & InStr(txt, "りんご") & " 文字目にあります"
End If
End Sub
利点
- 部分一致の位置(文字列内での開始位置)まで取得できる。
- 入力チェックや文章中のキーワード検索に有効。
参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法
・範囲全体でInStr検索
Sub LoopInStr()
Dim c As Range
For Each c In Range("A1:A100")
If InStr(c.Value, "りんご") > 0 Then
Debug.Print "セル位置:" & c.Address
End If
Next c
End Sub
参考:【VBA】文字列を検索してセルの位置を取得する方法|Find・InStr・ループを使った実務例✅ For Each+Ifでセル位置を確認する
・完全一致の例
Sub LoopSearchExact()
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
参考:【VBA】Findを使って完全一致検索を行う方法|LookAt:=xlWholeの実務活用例・部分一致の例
If InStr(c.Value, "りんご") > 0 Then
Debug.Print "セル位置:" & c.Address
End If
参考:【VBA】部分一致の処理をする方法:Like演算子✅ 実務で役立つ応用サンプル
・一致セルを色付け
Sub HighlightCells()
Dim rng As Range, firstAddress As String
With Range("B:B")
Set rng = .Find("エラー", LookAt:=xlPart)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
rng.Interior.Color = vbRed
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致セルを別シートに出力
Sub ExportSearchResults()
Dim c As Range, 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
wsOut.Cells(r, 1).Value = c.Value
wsOut.Cells(r, 2).Value = c.Address
r = r + 1
End If
Next c
End Sub
・一致セルの行をコピー
Sub CopyRows()
Dim rng As Range, firstAddress As String, wsOut As Worksheet
Dim r As Long
Set wsOut = Sheets("抽出結果")
r = 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(r)
r = r + 1
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・件数をカウント
Sub CountCells()
Dim c As Range, cnt As Long
cnt = 0
For Each c In Range("A1:A100")
If c.Value = "完了" Then
cnt = cnt + 1
End If
Next c
MsgBox "一致件数:" & cnt
End Sub
✅ セル位置取得の注意点
- Nothing判定を必ず入れる
Findで一致がなければNothingが返るため、エラー回避に必須。
参考:【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説 - 部分一致と完全一致の違いを理解
LookAt:=xlPartとxlWholeで結果が変わる。 - データ型やスペースに注意
数値型と文字列型の違いや不要な空白で一致しないケースがある。
参考:【VBA】シート全体のスペースを削除する方法:Trim 関数・Replace 関数 - 範囲指定を適切に
列全体よりも必要範囲に絞った方が処理が高速。
✅ セル位置検索の使い分けまとめ
- 高速検索したい場合 → Find
- 文字列中の位置まで必要な場合 → InStr
- 複雑条件を判定したい場合 → For Each+If
業務内容に応じて最適な方法を選択するのがポイントです。
■ まとめ:VBAでセル位置を効率的に取得しよう
Findで一致セルを高速に取得できる。InStrを使えばセル内の文字列位置まで特定可能。For Each+Ifは柔軟な条件判定に対応可能。- 実務では「色付け」「コピー」「件数カウント」と組み合わせるとさらに便利。
- Nothing判定や範囲指定の工夫で安定した検索処理が可能。
ExcelVBAで検索してセル位置を取得する方法をマスターすれば、大量データの中から必要な情報を瞬時に抽出でき、業務効率を大幅に改善できます。ぜひ本記事のサンプルを活用して、自動化スキルをさらに高めてください。