Excelで大量データを扱うときに「特定の文字列や数値を探したい」という場面はよくあります。その際に便利なのがVBAのFindメソッドです。しかし、実際にコードを書いてみると「検索値があるはずなのに見つからない」「マクロが途中で止まってしまう」といったトラブルに直面する方が少なくありません。
この記事では「vba find 見つからない」をテーマに、Findが期待通りに動作しない原因とその解決方法を詳しく解説します。さらに、エラーを避けるためのNothing判定や、実務で役立つ応用例も紹介していきます。
目次
- ✅ VBAのFindで「見つからない」が起こる典型的な原因
- ・検索範囲が正しく指定されていない
- ・完全一致と部分一致の指定ミス
- ・大文字小文字の違い
- ・セルに空白や余計な文字が含まれている
- ・前回の検索条件が引き継がれている
- ✅ Findの基本構文とNothing判定
- ・基本構文
- 理由
- ✅ 完全一致と部分一致の違いを確認する
- ・完全一致(LookAt:=xlWhole)
- ・部分一致(LookAt:=xlPart)
- ✅ Findが見つからないときのチェックリスト
- ・範囲指定の確認
- ・スペースを削除してから検索
- ・数値と文字列の区別
- ✅ 複数セルを検索する場合の注意
- ・FindNextを使った繰り返し検索
- 理由
- ✅ 実務で役立つサンプルコード集
- ・一致セルを色付けする
- ・一致セルの行をコピー
- ・一致件数を数える
- ✅ Findが見つからない問題を回避する工夫
- ■ まとめ:Findが見つからない原因と解決法を理解しよう
✅ VBAのFindで「見つからない」が起こる典型的な原因
・検索範囲が正しく指定されていない
最も多い原因は、検索範囲の指定ミスです。Range("A:A")で列全体を指定するのか、Range("A1:A100")で範囲を限定するのかによって、結果が変わることがあります。
参考:【VBA】文字列検索をFindで行う方法|セルの位置取得から応用テクニックまで解説
・完全一致と部分一致の指定ミス
FindのLookAt引数は、部分一致ならxlPart、完全一致ならxlWholeを指定します。これを誤ると「値はあるのに見つからない」という状況に陥ります。
・大文字小文字の違い
Excelの検索は既定では大文字小文字を区別しませんが、MatchCase:=Trueを指定すると区別されます。コードによっては意図せず区別されてしまうことがあります。
・セルに空白や余計な文字が含まれている
「見た目上は一致しているのに、検索できない」という場合、セル内に前後のスペースや不可視文字が含まれていることがあります。
参考:【VBA】Replace関数でスペース(半角:全角)を削除する方法
・前回の検索条件が引き継がれている
ExcelのFindは一度指定した検索条件を保持するため、引数を省略すると前回の条件が適用され、意図しない結果になることがあります。
✅ Findの基本構文とNothing判定
・基本構文
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
手順
Findで検索値を指定。- 戻り値が見つかった場合はセル範囲(Range)として返る。
- 見つからなければ
Nothingが返るので、その判定を入れる。
理由
Nothing判定を入れないと、検索結果がない場合に後続処理でエラーが発生してしまいます。
✅ 完全一致と部分一致の違いを確認する
・完全一致(LookAt:=xlWhole)
セルの値が検索文字列と完全に一致した場合のみヒットします。
Set rng = Range("A1:A100").Find("A1001", LookAt:=xlWhole)
・部分一致(LookAt:=xlPart)
セル内に検索文字列が含まれていればヒットします。
Set rng = Range("A1:A100").Find("りんご", LookAt:=xlPart)
実務では「商品コード」「社員番号」などは完全一致、「商品名」「備考」などは部分一致で使い分けます。
✅ Findが見つからないときのチェックリスト
・範囲指定の確認
「対象の範囲に本当に値があるのか?」を確認しましょう。Range("A:A")ではなくRange("A1:A1000")に変更するだけで結果が出ることがあります。
・スペースを削除してから検索
Cells.Replace What:=" ", Replacement:="", LookAt:=xlPart
セルの前後のスペースを削除してから検索すると解決することがあります。
・数値と文字列の区別
セルに「100」と表示されていても、文字列型か数値型かで一致しないことがあります。検索値を明示的に型変換すると解決します。
✅ 複数セルを検索する場合の注意
・FindNextを使った繰り返し検索
Sub FindAll()
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
理由
複数セルを探したい場合、Findだけでは最初の一致セルしか返しません。必ずFindNextと組み合わせる必要があります。
✅ 実務で役立つサンプルコード集
・一致セルを色付けする
Sub HighlightFound()
Dim rng As Range, firstAddress As String
With Range("A1:A100")
Set rng = .Find("完了", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
rng.Interior.Color = vbYellow
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致セルの行をコピー
Sub CopyMatchedRows()
Dim rng As Range, firstAddress As String
Dim wsOut As Worksheet
Dim rowOut As Long
Set wsOut = Sheets("抽出結果")
rowOut = 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(rowOut)
rowOut = rowOut + 1
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
・一致件数を数える
Sub CountFindResults()
Dim rng As Range, firstAddress As String
Dim cnt As Long
cnt = 0
With Range("A1:A100")
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
✅ Findが見つからない問題を回避する工夫
- Nothing判定を必ず入れる
- 引数を明示的に書く(特にLookAt、SearchOrder、MatchCase)
- データの前処理を行う(Trimでスペース削除、型変換など)
- 見つからなかったときの代替処理を用意する(MsgBoxで通知やログ出力)
■ まとめ:Findが見つからない原因と解決法を理解しよう
- 範囲指定や一致条件の誤りで「見つからない」ことが多い。
Nothing判定を必ず入れることでエラーを防げる。- 完全一致は
xlWhole、部分一致はxlPartを使い分ける。 - 複数セル検索は
FindNextを組み合わせる。 - スペースや文字型/数値型の違いも見つからない原因になりやすい。
ExcelVBAでFindを正しく使いこなせば、大量データの中から必要な情報を正確に抽出でき、業務効率化が大幅に進みます。ぜひ本記事のサンプルを参考に、安定した検索処理を組み立ててみてください。