Excelで大量データを扱うときに、特定の値を検索する作業は欠かせません。その中でも、VBAのFindメソッドは高速で強力な検索手段ですが、実務で使いこなすには「戻り値の扱い方」を正しく理解する必要があります。
「Findを使ったのに値が見つからない」「検索後にエラーが出る」などの問題の多くは、戻り値の仕組みを理解していないことに原因があります。
この記事では「vba find 戻り値」をテーマに、Findが返す戻り値の意味、Nothing判定の重要性、セルの位置や値を取り出す方法、さらに複数セルを扱う実務サンプルまでを徹底解説します。
目次
- ✅ Findの戻り値とは?
- ・Rangeオブジェクトを返す
- ・見つからなければNothingを返す
- ✅ 戻り値からセル情報を取得する方法
- ・セルのアドレスを取得
- ・セルの値を取得
- ・行番号や列番号を取得
- ✅ 完全一致と部分一致で戻り値の挙動が変わる
- ・完全一致
- ・部分一致
- ✅ 複数セルを検索する場合の戻り値
- ・FindNextで複数セルを処理
- ✅ Findの戻り値を活用した実務サンプル
- ・一致セルを強調表示する
- ・一致セルの行をコピー
- ・一致件数をカウント
- ✅ 戻り値が期待通りでないときの原因と解決策
- ・Nothingになるケース
- ・解決策
- ✅ Findの戻り値を安定的に扱うコツ
- ■ まとめ:Findの戻り値を正しく理解して安定した検索を実現しよう
✅ 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を返す
検索範囲に該当する値がない場合、Findは Nothing を返します。
If rng Is Nothing Then
MsgBox "該当データはありません"
End If
このNothing判定を入れないと、後続処理でエラーが発生するため非常に重要です。
参考:【VBA】Findが見つからないときの原因と解決方法|Nothing判定・コードの書き方を解説
✅ 戻り値からセル情報を取得する方法
・セルのアドレスを取得
MsgBox "一致セルの位置:" & rng.Address
・セルの値を取得
MsgBox "一致セルの値:" & rng.Value
・行番号や列番号を取得
MsgBox "行番号:" & rng.Row
MsgBox "列番号:" & rng.Column
これにより、検索結果を次の処理(コピーや削除など)に簡単に利用できます。
✅ 完全一致と部分一致で戻り値の挙動が変わる
・完全一致
Set rng = Range("A1:A100").Find("A1001", LookAt:=xlWhole)
セルの内容全体が検索文字列と一致した場合のみ戻り値が返る。
・部分一致
Set rng = Range("A1:A100").Find("りんご", LookAt:=xlPart)
「青りんご」「りんごジュース」なども戻り値として返される。
戻り値自体は常にRangeオブジェクトですが、検索条件の違いによってヒットするセルが変わります。
✅ 複数セルを検索する場合の戻り値
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になるケース
- 検索値が範囲に存在しない
- 前後にスペースが含まれている
- 数値と文字列の型が違う
・解決策
Trimで余計なスペースを削除
参考:【Excel】TRIM関数とLEN関数の活用法とは?Excelで文字列処理をスマートにする便利テクニックを徹底解説CStrやCLngで型変換
参考:【VBA】CStr関数:値を文字列に変換する- 検索範囲の再確認
✅ Findの戻り値を安定的に扱うコツ
- Nothing判定を必ず入れる
見つからない場合の処理を用意しておく。 - 検索条件を明示的に指定する
LookAtやMatchCaseを省略すると、前回の検索条件が引き継がれて意図しない結果になる。 - 複数セルは必ずFindNextを使う
戻り値をループ処理に組み込み、初回のアドレスと比較して終了判定を行う。 - 戻り値はRangeオブジェクト
値や位置を取り出すには.Valueや.Rowなどのプロパティを活用。
■ まとめ:Findの戻り値を正しく理解して安定した検索を実現しよう
Findの戻り値は一致セルを表すRangeオブジェクト。- 見つからなければ
Nothingが返るため、判定処理が必須。 .Addressや.Value、.Rowを使えばセルの詳細情報を取得可能。- 複数セル検索では
FindNextを組み合わせて戻り値をループ処理。 - 戻り値の仕組みを理解することで「見つからない」「エラーになる」問題を防げる。
ExcelVBAでFindの戻り値を正しく扱えば、大量データから必要な情報を正確に取り出し、業務効率化を大幅に進めることができます。ぜひ本記事の内容を参考に、安定した検索処理を組み立ててみてください。