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

【VBA】Findを使って列を指定して検索する方法|列内検索の基本と応用

Excelで業務データを扱うときに「特定の列から値を検索したい」という場面は非常に多くあります。例えば「社員IDが入力されている列から一致する番号を探す」「商品コードの列から対象データを抽出する」といった処理です。

手作業の検索やフィルターでも対応可能ですが、何度も繰り返すならExcelVBAで自動化したほうが効率的です。その際に便利なのがFindメソッドを使って 列を指定した検索 を行う方法です。

この記事では「vba find 列指定」をテーマに、基本構文から実務で役立つサンプルコードまでを詳しく解説します。初心者がつまずきやすい「見つからない」ケースや、複数ヒットへの対応方法もあわせて紹介します。

✅ Findで列を指定して検索する基本構文

・列全体を範囲指定して検索

列指定の基本は、検索範囲に Range("A:A") のように列全体を指定する方法です。

Sub FindInColumn()
    Dim rng As Range
    Set rng = Range("B:B").Find(What:="A1001", LookAt:=xlWhole)
    
    If Not rng Is Nothing Then
        MsgBox "見つかったセル:" & rng.Address & " 値=" & rng.Value
    Else
        MsgBox "該当データはありません"
    End If
End Sub

手順

  1. 検索対象の列を Range("B:B") のように指定。
  2. Findメソッドで検索値を指定。
  3. 一致セルがあればセルのアドレスや値を取得。

補足

  • 列全体を指定すると行数が多いため処理が重くなる場合があります。必要に応じて範囲を絞りましょう。
  • LookAt:=xlWholeで完全一致、LookAt:=xlPartで部分一致を選択できます。
    参考:【VBA】範囲指定の使い方:Offsetプロパティ

✅ 列指定検索で複数ヒットを取得する方法

・FindNextを利用した繰り返し検索

Findは最初の一致セルしか返さないため、複数セルを対象にする場合はFindNextを組み合わせます。

Sub FindAllInColumn()
    Dim rng As Range
    Dim firstAddress As String
    
    With Range("C:C")
        Set rng = .Find("完了", LookAt:=xlWhole)
        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

実務での活用例


✅ 部分一致で列検索を行う

・部分一致の指定方法

LookAt:=xlPart を使うと、セル内の一部に検索文字列が含まれる場合もヒットします。

Sub FindPartialInColumn()
    Dim rng As Range
    Set rng = Range("D:D").Find(What:="りんご", LookAt:=xlPart)
    
    If Not rng Is Nothing Then
        MsgBox "ヒット:" & rng.Address & " 値=" & rng.Value
    End If
End Sub

注意点

「りんご」で検索すると「青りんご」「りんごジュース」もヒットするため、必要に応じて完全一致と使い分けましょう。

参考:【VBA】部分一致の処理をする方法:Like演算子


✅ 列検索でよくある「見つからない」原因と対策

・範囲指定ミス

列を指定したつもりが、違う列を対象にしているケースが多いです。

・空白や全角スペース

見た目は一致しているようでも、セル内に余分なスペースがあるとヒットしません。
Trim関数で前後の空白を削除してから検索するのが有効です。
参考:【VBA】シート全体のスペースを削除する方法:Trim 関数・Replace 関数

・データ型の違い

数値に見える値が実際は文字列として扱われているケースもあります。
→ 検索時にCStrやCLngで型を揃えると改善します。

参考:【VBA】CStr関数:値を文字列に変換する


✅ 列指定検索の応用サンプル

・一致セルの行をコピー

Sub CopyRowFromColumnFind()
    Dim rng As Range, wsOut As Worksheet
    Set wsOut = Sheets("抽出結果")
    
    With Range("E:E")
        Set rng = .Find("重要", LookAt:=xlWhole)
        If Not rng Is Nothing Then
            rng.EntireRow.Copy wsOut.Rows(1)
        End If
    End With
End Sub

・一致セルを色付けする

Sub HighlightColumnFind()
    Dim rng As Range, firstAddress As String
    With Range("F:F")
        Set rng = .Find("エラー", LookAt:=xlPart)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                rng.Interior.Color = vbRed
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

・件数をカウント

Sub CountColumnMatches()
    Dim rng As Range, firstAddress As String
    Dim cnt As Long
    cnt = 0
    
    With Range("G:G")
        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

 

参考:【VBA】数値セル・特定の文字列のセル・値のセルなどのセル数のカウント方法


✅ 列検索を安定させるコツ

  1. Nothing判定を必ず入れる
    一致セルがない場合を考慮しないとエラーの原因になります。
  2. 検索条件を明示的に書く
    LookAtMatchCaseを省略すると前回の検索条件が引き継がれるため、必ず指定しましょう。
  3. 列全体よりも範囲を絞る
    行数が多い場合は Range("A1:A1000") のように限定したほうが処理が速くなります。

■ まとめ:Findで列指定検索をマスターしよう

  • Range("A:A")のように列を範囲指定すれば、列内で検索が可能。
  • 完全一致は LookAt:=xlWhole、部分一致は LookAt:=xlPart を使い分ける。
  • 複数セルを探す場合は FindNext を利用する。
  • 実務では「行コピー」「件数カウント」「色付け」との組み合わせが便利。
  • Nothing判定や検索条件の明示で「見つからない」問題を防げる。

ExcelVBAで列指定検索を使いこなせば、大量のデータから目的の情報を素早く抽出でき、業務効率化が大幅に進みます。

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