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

【VBA】文字列を検索してセルの位置を取得する方法|Find・InStr・ループを使った実務例

Excelで大量のデータを扱っていると、特定の文字列がどのセルに存在するのかを調べたい場面が多くあります。顧客名や商品コードをリストの中から探し出したり、コメントに含まれる特定キーワードの位置を確認したりと、実務に直結するニーズです。手作業で検索してもよいのですが、繰り返し行う処理ならばExcelVBAで自動化してしまうのが最も効率的です。

この記事では「vba 文字列検索 セル 位置」をテーマに、セル内やシート全体から文字列を検索し、位置を取得する方法を徹底解説します。初心者でも理解しやすい基本的な書き方から、実務で役立つ応用コードまで丁寧に説明していきます。

✅ VBAで文字列検索を行う基本的な考え方

ExcelVBAで文字列を検索してセルの位置を取得する方法は、大きく分けて次の3種類があります。

  1. Findメソッド:シート内から文字列を検索し、セルを直接取得する
  2. InStr関数:セル内の文字列の中で、検索対象が何文字目にあるかを調べる
  3. ループ+If:すべてのセルを順番に確認して一致を判定する

それぞれの方法に得意・不得意があるため、用途に合わせて選ぶことが重要です。


✅ Findメソッドでセルの位置を取得する

・Findメソッドの基本構文

Range.Find は、指定した範囲の中から検索条件に一致するセルを探し出すメソッドです。検索結果は Range オブジェクトとして返されるので、そのまま位置を取得できます。

参考:【VBA】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. 検索する範囲を指定(例:A1:A100)。
  2. Find メソッドで検索キーワードを指定。
  3. 一致するセルがあれば、そのセルのアドレスを返す。

理由

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

手順

  1. セルの値を文字列として変数に格納。
  2. InStr を使って検索対象の文字列が含まれる位置を取得。
  3. 戻り値が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より処理速度は遅いですが、条件を柔軟に組み合わせられるのが強みです。数値との比較や複数条件を判定するときに便利です。

参考:【VBA】部分一致の処理をする方法:Like演算子


✅ 実務で役立つ応用例

・一致セルを色付けする

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

✅ 注意点とエラー対策

  1. FindのNothing判定を忘れない
    一致しない場合は Nothing が返るため、必ず判定を入れる。
  2. 部分一致と完全一致の違いに注意
    • 完全一致 → LookAt:=xlWhole
    • 部分一致 → LookAt:=xlPart
  3. 大文字小文字の区別
    • MatchCase:=True を指定すると区別あり。
  4. ループ処理の速度に注意
    • 数万行規模では Find を使った方が高速。

■ まとめ:VBAで文字列検索とセル位置取得をマスターしよう

  • Find を使えばシート全体から高速に検索でき、セルの位置を直接取得できる。
  • InStr はセル内での文字列の位置を調べるのに便利。
  • For Each+If は処理速度は落ちるが複雑条件に強い。
  • 実務では「色付け」「別シートへの出力」「行コピー」などと組み合わせると効率的。

ExcelVBAで文字列検索とセル位置取得をマスターすれば、大量データの中から必要な情報を瞬時に抽出し、業務効率を飛躍的に高めることができます。ぜひ日々の業務に活用してみてください。

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