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

【VBA】検索してセル位置を取得する方法|Find・InStr・ループを徹底活用

Excelを使っていて「特定の文字列や数値がどこに入力されているのか分からない」という場面は多くあります。手作業で検索することも可能ですが、データ量が多い場合は効率が悪く、同じ作業を繰り返すとミスの原因にもなります。そんなときに便利なのが ExcelVBAを使って検索し、セルの位置を取得する方法 です。

この記事では「vba 検索 セル位置 取得」をテーマに、基本の検索方法から複数セルの取得、応用的な実務サンプルまで解説します。初心者でも理解できるように、コード例と手順を丁寧に紹介します。

✅ VBAでセル位置を取得する3つの基本手法

・Findメソッド

Excelの検索機能をVBAから利用できるメソッドで、最も高速かつ効率的にセル位置を取得できます。

・InStr関数+ループ

セル内の文字列に対して部分一致の検索を行う方法。柔軟に条件を判定できます。

・For Each+If

すべてのセルを順にチェックして、条件に一致すればセル位置を取得。シンプルで直感的ですが処理はやや遅めです。

参考:【VBA】条件に合うデータを抽出:For文・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

手順

  1. 検索対象範囲を指定。
  2. Findで検索文字列を指定。
  3. 戻り値のRangeオブジェクトからセル位置を取得。
  4. 一致がなければ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

利点


・範囲全体で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

✅ セル位置取得の注意点

  1. Nothing判定を必ず入れる
    Findで一致がなければNothingが返るため、エラー回避に必須。
    参考:【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説
  2. 部分一致と完全一致の違いを理解
    LookAt:=xlPartxlWholeで結果が変わる。
  3. データ型やスペースに注意
    数値型と文字列型の違いや不要な空白で一致しないケースがある。
    参考:【VBA】シート全体のスペースを削除する方法:Trim 関数・Replace 関数
  4. 範囲指定を適切に
    列全体よりも必要範囲に絞った方が処理が高速。

✅ セル位置検索の使い分けまとめ

  • 高速検索したい場合 → Find
  • 文字列中の位置まで必要な場合 → InStr
  • 複雑条件を判定したい場合 → For Each+If

業務内容に応じて最適な方法を選択するのがポイントです。


■ まとめ:VBAでセル位置を効率的に取得しよう

  • Findで一致セルを高速に取得できる。
  • InStrを使えばセル内の文字列位置まで特定可能。
  • For Each+Ifは柔軟な条件判定に対応可能。
  • 実務では「色付け」「コピー」「件数カウント」と組み合わせるとさらに便利。
  • Nothing判定や範囲指定の工夫で安定した検索処理が可能。

ExcelVBAで検索してセル位置を取得する方法をマスターすれば、大量データの中から必要な情報を瞬時に抽出でき、業務効率を大幅に改善できます。ぜひ本記事のサンプルを活用して、自動化スキルをさらに高めてください。

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