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

【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説

Excelで大量データを扱うときに、特定の値を検索する作業は欠かせません。その中でも、VBAのFindメソッドは高速で強力な検索手段ですが、実務で使いこなすには「戻り値の扱い方」を正しく理解する必要があります。

「Findを使ったのに値が見つからない」「検索後にエラーが出る」などの問題の多くは、戻り値の仕組みを理解していないことに原因があります。

この記事では「vba find 戻り値」をテーマに、Findが返す戻り値の意味、Nothing判定の重要性、セルの位置や値を取り出す方法、さらに複数セルを扱う実務サンプルまでを徹底解説します。

✅ Findの戻り値とは?

・Rangeオブジェクトを返す

Findの戻り値は、検索で一致したセルを表す Rangeオブジェクト です。

Dim rng As Range
Set rng = Range("A1:A100").Find(What:="検索値", LookAt:=xlWhole)

上記コードで一致が見つかれば、rngはそのセルを参照するオブジェクトとなります。
たとえば、セルのアドレスや値を簡単に取得できます。

MsgBox rng.Address
MsgBox rng.Value

参考:【VBA】変数を使ってセル範囲を指定する方法|柔軟な範囲操作の基本と応用

・見つからなければNothingを返す

検索範囲に該当する値がない場合、FindNothing を返します。

If rng Is Nothing Then
    MsgBox "該当データはありません"
End If

このNothing判定を入れないと、後続処理でエラーが発生するため非常に重要です。

参考:【VBA】Findが見つからないときの原因と解決方法|Nothing判定・コードの書き方を解説


✅ 戻り値からセル情報を取得する方法

・セルのアドレスを取得

MsgBox "一致セルの位置:" & rng.Address

・セルの値を取得

MsgBox "一致セルの値:" & rng.Value

・行番号や列番号を取得

MsgBox "行番号:" & rng.Row
MsgBox "列番号:" & rng.Column

これにより、検索結果を次の処理(コピーや削除など)に簡単に利用できます。

参考:【VBA】最終行番号を取得する方法


✅ 完全一致と部分一致で戻り値の挙動が変わる

・完全一致

Set rng = Range("A1:A100").Find("A1001", LookAt:=xlWhole)

セルの内容全体が検索文字列と一致した場合のみ戻り値が返る。

参考:【VBA】文字列の完全一致の処理(IF文)

・部分一致

Set rng = Range("A1:A100").Find("りんご", LookAt:=xlPart)

「青りんご」「りんごジュース」なども戻り値として返される。

戻り値自体は常にRangeオブジェクトですが、検索条件の違いによってヒットするセルが変わります。

参考:【VBA】文字列の部分一致(IF文)


✅ 複数セルを検索する場合の戻り値

Findは最初に見つかったセルだけを返します。複数セルを取得したい場合は、FindNextと組み合わせる必要があります。

・FindNextで複数セルを処理

Sub FindAllValues()
    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 & " 値=" & rng.Value
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

このときも戻り値はRangeオブジェクトであり、ループごとに新しいセルを参照します。


✅ Findの戻り値を活用した実務サンプル

・一致セルを強調表示する

Sub HighlightFindResult()
    Dim rng As Range
    Set rng = Range("B:B").Find("エラー", LookAt:=xlPart)
    
    If Not rng Is Nothing Then
        rng.Interior.Color = vbRed
    End If
End Sub

・一致セルの行をコピー

Sub CopyRowFindResult()
    Dim rng As Range, wsOut As Worksheet
    Set wsOut = Sheets("抽出結果")
    
    Set rng = Range("C:C").Find("完了", LookAt:=xlWhole)
    If Not rng Is Nothing Then
        rng.EntireRow.Copy wsOut.Rows(1)
    End If
End Sub

・一致件数をカウント

Sub CountFindResults()
    Dim rng As Range, firstAddress As String
    Dim cnt As Long
    
    cnt = 0
    With Range("A:A")
        Set rng = .Find("重要", LookAt:=xlWhole)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                cnt = cnt + 1
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
    
    MsgBox "一致件数:" & cnt
End Sub

✅ 戻り値が期待通りでないときの原因と解決策

・Nothingになるケース

  • 検索値が範囲に存在しない
  • 前後にスペースが含まれている
  • 数値と文字列の型が違う

・解決策


✅ Findの戻り値を安定的に扱うコツ

  1. Nothing判定を必ず入れる
    見つからない場合の処理を用意しておく。
  2. 検索条件を明示的に指定する
    LookAtMatchCaseを省略すると、前回の検索条件が引き継がれて意図しない結果になる。
  3. 複数セルは必ずFindNextを使う
    戻り値をループ処理に組み込み、初回のアドレスと比較して終了判定を行う。
  4. 戻り値はRangeオブジェクト
    値や位置を取り出すには.Value.Rowなどのプロパティを活用。

■ まとめ:Findの戻り値を正しく理解して安定した検索を実現しよう

  • Findの戻り値は一致セルを表すRangeオブジェクト。
  • 見つからなければNothingが返るため、判定処理が必須。
  • .Address.Value.Rowを使えばセルの詳細情報を取得可能。
  • 複数セル検索ではFindNextを組み合わせて戻り値をループ処理。
  • 戻り値の仕組みを理解することで「見つからない」「エラーになる」問題を防げる。

ExcelVBAでFindの戻り値を正しく扱えば、大量データから必要な情報を正確に取り出し、業務効率化を大幅に進めることができます。ぜひ本記事の内容を参考に、安定した検索処理を組み立ててみてください。

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