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

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

Excelで大量データを扱うときに「特定の文字列や数値を探したい」という場面はよくあります。その際に便利なのがVBAのFindメソッドです。しかし、実際にコードを書いてみると「検索値があるはずなのに見つからない」「マクロが途中で止まってしまう」といったトラブルに直面する方が少なくありません。

この記事では「vba find 見つからない」をテーマに、Findが期待通りに動作しない原因とその解決方法を詳しく解説します。さらに、エラーを避けるためのNothing判定や、実務で役立つ応用例も紹介していきます。

✅ VBAのFindで「見つからない」が起こる典型的な原因

・検索範囲が正しく指定されていない

最も多い原因は、検索範囲の指定ミスです。Range("A:A")で列全体を指定するのか、Range("A1:A100")で範囲を限定するのかによって、結果が変わることがあります。

参考:【VBA】文字列検索をFindで行う方法|セルの位置取得から応用テクニックまで解説

・完全一致と部分一致の指定ミス

FindLookAt引数は、部分一致なら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

手順

  1. Findで検索値を指定。
  2. 戻り値が見つかった場合はセル範囲(Range)として返る。
  3. 見つからなければNothingが返るので、その判定を入れる。

理由

Nothing判定を入れないと、検索結果がない場合に後続処理でエラーが発生してしまいます。


✅ 完全一致と部分一致の違いを確認する

・完全一致(LookAt:=xlWhole)

セルの値が検索文字列と完全に一致した場合のみヒットします。

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

・部分一致(LookAt:=xlPart)

セル内に検索文字列が含まれていればヒットします。

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

実務では「商品コード」「社員番号」などは完全一致、「商品名」「備考」などは部分一致で使い分けます。

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


✅ 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が見つからない問題を回避する工夫

  1. Nothing判定を必ず入れる
  2. 引数を明示的に書く(特にLookAt、SearchOrder、MatchCase)
  3. データの前処理を行う(Trimでスペース削除、型変換など)
  4. 見つからなかったときの代替処理を用意する(MsgBoxで通知やログ出力)

■ まとめ:Findが見つからない原因と解決法を理解しよう

  • 範囲指定や一致条件の誤りで「見つからない」ことが多い。
  • Nothing判定を必ず入れることでエラーを防げる。
  • 完全一致は xlWhole、部分一致は xlPart を使い分ける。
  • 複数セル検索は FindNext を組み合わせる。
  • スペースや文字型/数値型の違いも見つからない原因になりやすい。

ExcelVBAでFindを正しく使いこなせば、大量データの中から必要な情報を正確に抽出でき、業務効率化が大幅に進みます。ぜひ本記事のサンプルを参考に、安定した検索処理を組み立ててみてください。

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