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

【VBA】文字列のセル位置を検索する方法|Findの正しい使い方と設計思想

Excel VBAで業務を自動化していると、
「特定の文字列がどのセルにあるのかを特定したい」という場面は非常に多く発生します。

請求書番号、担当者名、ステータス文字列、エラーメッセージなど、
“値そのもの”ではなく“場所”を起点に処理したいケースは実務では日常的です。

一方で、
「Findを使ったら動いたが、たまに見つからない」
「別のマクロと組み合わせると挙動がおかしい」
といったトラブルも頻発します。

この記事では、
文字列のセル位置を検索する基本から、
Findを安全に使うための設計思想、
実務で評価される実装パターンまでを解説します。

✅ VBAで文字列のセル位置を検索する基本的な考え方

文字列検索は単純に見えますが、
検索条件・検索状態・戻り値の扱いを正しく理解していないと不安定になります。

特にFindは「前回の検索条件を引き継ぐ」という特性があり、
これを知らずに使うと、同じコードなのに結果が変わる現象が起こります。

・セル位置検索の基本方針

  • 検索対象範囲を明示する
  • 戻り値(Range)を必ずチェックする
  • 検索条件は毎回明示的に指定する

この3点を守るだけで、事故率は大きく下がります。


✅ VBAで文字列を検索してセル位置を取得する基本例

まずは、最も基本となるFindの使い方です。

Option Explicit

Sub FindCellPositionBasic()

    Dim targetRange As Range
    Dim foundCell As Range
    
    ' 検索対象範囲を明示
    Set targetRange = Worksheets("Sheet1").Range("A1:D100")
    
    ' 文字列を検索
    Set foundCell = targetRange.Find( _
        What:="完了", _
        LookAt:=xlWhole, _
        LookIn:=xlValues _
    )
    
    ' 検索結果の判定
    If Not foundCell Is Nothing Then
        MsgBox "見つかったセル:" & foundCell.Address
    Else
        MsgBox "該当する文字列は見つかりませんでした"
    End If

End Sub

なぜこの書き方にしているのか

FindはRangeオブジェクトを返すため、
見つからなかった場合は Nothing になります。
この判定を省略すると、後続処理でエラーが発生します。

別の書き方と比べたメリット

  • 検索範囲が明確で意図が伝わりやすい
  • 見つからないケースを安全に処理できる
  • 他マクロと組み合わせても挙動が安定する

実務で気をつけるポイント

Findは「成功前提」で書くと壊れやすいため、
必ず見つからない場合の分岐を含めるのが実務では必須です。


✅ Findでセル位置検索が不安定になる原因

「昨日まで動いていたのに、今日は見つからない」
この現象の多くは、Findの仕様を正しく理解していないことが原因です。

・主な原因

  • LookAt / LookIn を省略している
  • 前回のFind条件が引き継がれている
  • アクティブシート前提で書いている

Findは、
最後に使われた検索条件をExcelが記憶するため、
条件を省略すると環境依存になります。

Findでセル位置検索が不安定になる原因の多くは、
検索条件そのものよりも、
「アクティブ状態や選択状態に依存したコード設計」にあります。

VBAでは、Selectionを前提に書くべき場面と、
そうでない場面を正しく切り分けることが重要です。

その判断基準については、
【VBA】Selectionは使うべき?使わないべき?正しい考え方と実務判断
で詳しく整理しています。


✅ Findの検索条件は必ず明示する

実務で評価されるFindの書き方は、
「冗長でも条件をすべて指定する」構成です。

Set foundCell = targetRange.Find( _
    What:="完了", _
    LookAt:=xlWhole, _
    LookIn:=xlValues, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, _
    MatchCase:=False _
)

なぜ条件をすべて指定するのか

  • 実行環境による差をなくすため
  • 他人のマクロと干渉しないため
  • 将来の仕様変更に耐えるため

Findは「短く書くほど危険」
という意識を持つことが重要です。


✅ 複数ヒットする場合のセル位置取得

同じ文字列が複数存在する場合、
最初の1件だけでは不十分なケースもあります。

・FindNextを使った基本パターン

Option Explicit

Sub FindMultipleCells()

    Dim targetRange As Range
    Dim firstCell As Range
    Dim foundCell As Range
    
    Set targetRange = Worksheets("Sheet1").Range("A1:D100")
    
    Set firstCell = targetRange.Find(What:="完了", LookAt:=xlWhole)
    
    If firstCell Is Nothing Then Exit Sub
    
    Set foundCell = firstCell
    
    Do
        Debug.Print foundCell.Address
        Set foundCell = targetRange.FindNext(foundCell)
    Loop While Not foundCell Is Nothing And foundCell.Address <> firstCell.Address

End Sub

実務での判断ポイント

  • 無限ループ防止のため、最初のセルを保持する
  • 件数が多い場合は配列化を検討する
  • 「位置が必要か」「値だけでいいか」を事前に整理する

✅ 行番号・列番号として位置を使いたい場合

セルそのものではなく、
行番号・列番号として扱いたいケースも多くあります。

If Not foundCell Is Nothing Then
    Debug.Print "行:" & foundCell.Row
    Debug.Print "列:" & foundCell.Column
End If

この形にしておくと、
後続のループ処理や条件分岐に組み込みやすくなります。

セル位置を行番号・列番号として取得できるようになると、
その情報を使って
行や列を非表示・再表示する処理へと発展させるケースも多くなります。

特に、
「非表示にしたはずの行・列が戻らない」
「どこが隠れているのか分からない」
といったExcel側のトラブルについては、
【Excel】行・列の非表示と解除まとめ|再表示できない原因も完全網羅
で詳しく解説しています。


✅ Findを使わずに位置を特定する考え方

すべてのケースでFindが最適とは限りません。

  • 構造が固定された表
  • 見出し行が決まっている帳票

こうした場合は、
列や行を先に特定する設計の方が安定することもあります。

「検索する」のではなく
「構造を前提にする」という判断も、
実務では重要な設計思考です。


✅ エラーや未検出に強い実務向け構成

文字列検索は、
見つからないこと自体が正常なケースもあります。

そのため、

  • 見つからなかったら処理を分岐する
  • ログやメッセージを残す
  • 後続処理を止めない

といった設計が、
実務では高く評価されます。


✅ VBA自動化では「位置検索」は設計で決まる

セル位置検索はテクニックではなく、
設計の一部です。

  • なぜ位置が必要なのか
  • 値だけではダメなのか
  • 構造前提にできないか

ここを整理してから実装することで、
壊れにくいマクロになります。


 

✅ まとめ:VBAで文字列のセル位置を安全に検索する方法

  • Findは必ず検索条件を明示する
  • 戻り値がNothingかどうかを必ず判定する
  • 複数ヒット時はFindNextで制御する
  • 行・列として扱うと再利用性が高い
  • 「検索が必要か」を設計段階で考える

文字列のセル位置検索は、
VBA実務では避けて通れない処理です。

ぜひ今回の考え方を取り入れて、
安定して引き継げるマクロ設計を実践してみてください。

文字列のセル位置を検索する処理は、
単なるVBAテクニックではなく、
業務フローの中で「どこを基点に処理するか」を決める設計判断です。

Excel業務をどこまで自動化すべきか、
VBAで続けるのか、別のツールを検討すべきか迷っている場合は、
Excel業務改善はどう判断すべきか?ツール・自動化に迷う前の設計思考
もあわせて読むことで、全体像が整理できます。

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