【2026年7月最新】VBA Find・FindNextで検索する完全ガイド|完全一致・部分一致・複数ヒット・落とし穴まで網羅

【2026年7月最新】VBA Find・FindNextで検索する完全ガイド|完全一致・部分一致・複数ヒット・落とし穴まで網羅

ExcelのVBAでセルを検索するとき、多くの方がFindメソッドの使い方で詰まります。「完全一致で検索したいのに部分一致でもヒットする」「FindNextでループしたら無限ループになった」「なぜか同じコードが動いたり動かなかったりする」——こういった問題はすべて、FindメソッドのVBA特有の仕様を知らないことが原因です。

この記事では、VBAのFind・FindNext・FindPreviousを完全に理解するために必要な知識を一冊の参考書レベルで整理します。特に「引数の設定が前回の実行結果を引き継いでしまう」という、ほとんどの入門記事が触れていない重大な落とし穴も詳しく解説します。

AI鬼管理山崎 AI鬼管理山崎
VBAのFindメソッドは引数が9個もあるため、初見は複雑に見えます。でも実際に使うのは「What(何を検索するか)」「LookAt(完全一致か部分一致か)」「LookIn(値か数式かコメントか)」の3つだけがほとんどです。この3つを押さえれば、業務で使う検索の9割はカバーできます。
代表菅澤 代表菅澤
一点だけ強調しておきたいのが「引数の引き継ぎ」問題です。これを知らずにFindを使い続けると、「昨日動いたコードが今日動かない」という謎バグに延々と悩まされます。ぜひSection7まで読んでください。
✔️FindメソッドとForループの違いと使い分け
✔️引数9個の意味と実用的な使い方
✔️完全一致(xlWhole)・部分一致(xlPart)・Nothing判定
✔️FindNextによる複数ヒット検索(無限ループ対策あり)
✔️引数の設定が前回値を引き継ぐ罠と対処法(差別化ポイント)
✔️複数シートをまたいだ横断検索の実装
✔️Claude Codeを使ったVBA検索マクロの自動生成
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBA Find・FindNextで検索する完全ガイド|完全一致・部分一致・複数ヒット・落とし穴まで網羅
VBAのFindメソッド・FindNextメソッドを完全解説。完全一致/部分一致/複数ヒット/複数条件の検索コード、引数が前回設定を引き継ぐ重大な落とし穴、複数シートをまたいだ検索、Claude Code活用まで網羅。

01 Findメソッドとは(基本と仕組み) ForループとFindの違い、どちらを使うべき場面

VBAのFindメソッドは、指定したセル範囲の中から条件に一致するセルを検索して、最初に見つかったセルをRangeオブジェクトとして返すメソッドです。Excelの「Ctrl+F」(検索ダイアログ)をVBAからプログラムで操作するイメージです。

📚 用語解説

Findメソッド:RangeオブジェクトのメソッドでRange.Find(What, ...)という形で使う。指定した文字列・数値・日付などを検索範囲内で探し、最初に見つかったセルをRangeオブジェクトで返す。見つからない場合はNothingを返す。ExcelのCtrl+Fと同じ機能をVBAから呼び出せる。

方法メリットデメリット推奨場面
For Eachループコードが直感的・制御が自由セル数が多いと低速シンプルな処理・全セル走査
Find / FindNext高速(内部エンジン使用)・指定行/列方向検索引数の引き継ぎ問題・初心者には難しい大量データ・部分一致・特定方向検索
FilterオートフィルタUIと連動・視覚的検索後の処理が複雑一時的なフィルタリング
Match関数(WorksheetFunction)一致位置を数値で返す一致セル全部は取れないインデックス取得・VLOOKUP代替

FindメソッドはExcel内部の検索エンジンを直接呼び出すため、For Eachループで全セルを走査するより数十倍高速に動作します。特に数千行以上のデータを扱う場合は、FindNext(複数ヒット検索)との組み合わせが必須です。

💡 Findはどのセル範囲でも使える

Cells.Find(...) で全シート検索、Columns("A").Find(...) でA列のみ、Range("B:D").Find(...) でB〜D列のみ、というように検索範囲を柔軟に絞り込めます。大きなシートでは検索範囲を絞るほど高速になります。

02 Findメソッドの引数9個を完全解説 What以外の省略可能な引数の意味と使い分け

Findメソッドの基本構文は以下の通りです。Whatだけが必須引数で、残り8個はすべて省略できます。

' Findメソッドの完全構文
Range("検索範囲").Find(
    What,           ' 【必須】検索する値
    After,          ' 検索を開始するセル(このセルの「次」から開始)
    LookIn,         ' 検索対象(値/数式/コメント)
    LookAt,         ' 一致方法(完全一致/部分一致)
    SearchOrder,    ' 検索方向(行方向/列方向)
    SearchDirection,' 検索の進行方向(前方/後方)
    MatchCase,      ' 大文字小文字を区別するか
    MatchByte,      ' 全角半角を区別するか
    SearchFormat    ' 書式条件で検索するか
)
引数名定数・値の例意味省略時のデフォルト
What"東京", 100, "2026*"検索する値(ワイルドカード使用可)省略不可(必須)
AfterRange("A1")このセルの「次」から検索開始選択範囲の最初のセル
LookInxlValues, xlFormulas, xlComments検索対象(セルの値/数式/コメント)前回の設定(要注意!)
LookAtxlWhole, xlPart完全一致 / 部分一致前回の設定(要注意!)
SearchOrderxlByRows, xlByColumns検索順序(行ごと / 列ごと)前回の設定(要注意!)
SearchDirectionxlNext, xlPrevious前方(下)へ / 後方(上)へ進むxlNext(前方)
MatchCaseTrue, False大文字小文字区別(True=区別)前回の設定(要注意!)
MatchByteTrue, False全角半角区別(True=区別)前回の設定(要注意!)
SearchFormatTrue, False書式で検索するかFalse
⚠️ 「前回の設定」を引き継ぐ引数に注意!

LookIn・LookAt・SearchOrder・MatchCase・MatchByteの5引数は、省略すると前回のFindまたはCtrl+F検索ダイアログの設定値が使われます。これが「同じコードなのに結果が変わる」原因になります。詳しくはSection7で解説します。

📚 用語解説

LookIn:Findメソッドの引数で、何を対象に検索するかを指定する。xlValues(セルに表示されている値)、xlFormulas(数式そのもの。数式バーの内容)、xlComments(コメント・メモの内容)の3種類。計算結果の数値で検索したいならxlValues、数式文字列で検索したいならxlFormulas。

03 完全一致・部分一致・Nothing判定の基本 最も頻繁に使う3パターンのコードと解説

3-1. 完全一致検索(LookAt:=xlWhole)

Sub FindExactMatch()
    Dim rng As Range
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' 完全一致で "東京都" を検索
    ' LookAt:=xlWhole で完全一致を明示する(省略すると前回設定が引き継がれる)
    Set rng = ws.Range("A:A").Find(
        What:="東京都",
        LookAt:=xlWhole,
        LookIn:=xlValues
    )

    ' Nothing チェック(見つからない場合のハンドリング)
    If rng Is Nothing Then
        MsgBox "「東京都」は見つかりませんでした"
    Else
        MsgBox "「東京都」が見つかりました: " & rng.Address & " (行=" & rng.Row & ")"
        rng.Select  ' 見つかったセルを選択
    End If
End Sub

📚 用語解説

xlWhole / xlPart:VBA定数。xlWhole(値=1)は完全一致で「セルの内容が検索文字列と完全に一致するセル」のみ返す。xlPart(値=2)は部分一致で「セルの内容に検索文字列が含まれるセル」を返す。例: 検索語「東京」でxlWholeは「東京」だけ、xlPartは「東京都」「東京駅」なども返す。

3-2. 部分一致検索(LookAt:=xlPart)

Sub FindPartialMatch()
    Dim rng As Range
    Set rng = ActiveSheet.Cells.Find(
        What:="株式会社",
        LookAt:=xlPart,     ' 部分一致
        LookIn:=xlValues
    )

    If Not rng Is Nothing Then
        MsgBox "最初のヒット: " & rng.Value & " (行:" & rng.Row & ")"
    End If
End Sub

' ワイルドカードも使える(LookAtの設定に注意)
Sub FindWithWildcard()
    Dim rng As Range
    ' "*2026*" で2026を含む任意の文字列を検索
    Set rng = ActiveSheet.Range("A:A").Find(
        What:="*2026*",
        LookAt:=xlWhole,    ' ワイルドカード使用時はxlWholeが安全
        LookIn:=xlValues
    )
    If Not rng Is Nothing Then
        MsgBox "発見: " & rng.Value
    End If
End Sub
💡 ワイルドカードはFindでも使える

What引数に「*」(任意の文字列)や「?」(任意の1文字)のワイルドカードが使えます。「*東京*」で「東京」を含む文字列、「??株式会社」で2文字+株式会社の検索が可能です。ワイルドカードを使う場合はLookAt:=xlWholeの方が結果が予測しやすいです。

Range("A:A").Find(...)
検索範囲とFindを
呼び出す
If rng Is Nothing
見つからない場合
Nothingを返す
ヒット処理
rng.Address・
rng.Value等で
セル情報取得
FindNextで
次を検索

複数ヒットが
必要な場合のみ
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 FindNextで複数ヒットを検索する 無限ループ対策付きのDo Loopテンプレート

Findメソッドは最初の1件しか返しません。複数のセルをすべて取得したい場合は、FindNextメソッドを組み合わせてDo Loopで繰り返します。

⚠️ 無限ループに注意!FindNextは終わりまで来ると最初に戻る

FindNextは検索範囲の末尾まで来ると自動的に先頭に戻って検索を続けます。終了条件を設定しないと永遠に回り続けるため、「最初に見つかったセルのアドレスを保存して、再度同じアドレスに来たらループを抜ける」という終了条件が必須です。

Sub FindNextMultiple()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim rng As Range
    Dim firstAddr As String     ' 最初に見つかったアドレスを記録する

    ' 最初のFindで1件目を取得
    Set rng = ws.Columns("A").Find(
        What:="東京",
        LookAt:=xlPart,
        LookIn:=xlValues
    )

    ' 1件も見つからない場合は終了
    If rng Is Nothing Then
        MsgBox "検索結果なし"
        Exit Sub
    End If

    ' 最初に見つかったアドレスを保存(ループ終了判定に使う)
    firstAddr = rng.Address

    Dim hitCount As Long
    hitCount = 0

    ' 無限ループ対策付きのDo Loop
    Do
        hitCount = hitCount + 1
        Debug.Print hitCount & "件目: " & rng.Address & " / " & rng.Value

        ' 任意の処理(例: 背景色を変える)
        rng.Interior.ColorIndex = 6  ' 黄色

        ' 次のヒットを検索
        Set rng = ws.Columns("A").FindNext(rng)

        ' 最初のセルに戻ってきたらループ終了
    Loop While Not rng Is Nothing And rng.Address <> firstAddr

    MsgBox hitCount & "件見つかりました"
End Sub

📚 用語解説

FindNextメソッド:RangeオブジェクトのメソッドでRange.FindNext(After)という形で使う。Findで最初の1件を見つけた後、同じ検索条件で次のヒットを順番に取得できる。FindNextはSearchDirection:=xlNextで前方(下)方向に進む。After引数には「前回見つかったセル」を渡す。

AI鬼管理山崎 AI鬼管理山崎
Do Loop While の条件に注目してください。「Not rng Is Nothing」(まだNothingでないか)と「rng.Address <> firstAddr」(最初に戻ってきていないか)の両方をチェックしています。どちらかが欠けると無限ループになったり、最後の1件を取り逃したりします。

05 FindPreviousで逆順検索する 下から上へ検索する方法と使い所

Findメソッドにはデフォルトで上から下(前方方向)へ検索するほかに、FindPreviousで下から上(後方方向)へ検索する方法があります。また、Find自体にSearchDirection引数で方向を指定することもできます。

' ===== FindPreviousを使って逆順に検索 =====
Sub FindPreviousExample()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim rng As Range
    Dim firstAddr As String

    ' まず最初の1件を取得(通常のFindで下から順に返す起点を決める)
    Set rng = ws.Columns("A").Find(
        What:="東京",
        LookAt:=xlPart,
        LookIn:=xlValues,
        SearchDirection:=xlPrevious  ' ← 後方(上方向)検索
    )

    If rng Is Nothing Then
        MsgBox "見つかりませんでした"
        Exit Sub
    End If

    firstAddr = rng.Address

    Dim results() As String
    Dim count As Long
    count = 0

    Do
        count = count + 1
        ReDim Preserve results(count - 1)
        results(count - 1) = rng.Address & "(" & rng.Value & ")"

        Set rng = ws.Columns("A").FindPrevious(rng)
    Loop While Not rng Is Nothing And rng.Address <> firstAddr

    MsgBox count & "件 (逆順): " & Join(results, ", ")
End Sub
💡 最後の入力行を素早く見つけるのに有用

A列の最後に入力されたデータ行を探す場合、「Find + SearchDirection:=xlPrevious」または「FindPrevious」を使うと、最後のデータがある行番号を素早く取得できます。Cells(Rows.Count,"A").End(xlUp).Row との使い分けは、「見つかったセルの値も必要かどうか」で判断しましょう。

06 複数条件(OR検索・AND検索)の実装 2つ以上のキーワードでORまたはAND検索するコードパターン

6-1. OR検索(どちらかに一致するセルを探す)

「AまたはBを含むセル」を検索するOR検索は、キーワードごとに独立したFindNextループを実行し、結果をマージする方法が最も確実です。

Sub OrSearch()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim keywords() As String
    keywords = Array("東京", "大阪")  ' ← OR検索する複数キーワード

    Dim hitAddrs As New Collection  ' 重複しないようコレクションで管理

    Dim kw As Variant
    For Each kw In keywords
        Dim rng As Range
        Dim firstAddr As String

        Set rng = ws.Columns("A").Find(
            What:=kw,
            LookAt:=xlPart,
            LookIn:=xlValues
        )

        If Not rng Is Nothing Then
            firstAddr = rng.Address
            Do
                ' 重複チェックしてからコレクションに追加
                Dim isDup As Boolean
                isDup = False
                Dim addr As Variant
                For Each addr In hitAddrs
                    If addr = rng.Address Then isDup = True: Exit For
                Next addr
                If Not isDup Then hitAddrs.Add rng.Address

                Set rng = ws.Columns("A").FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddr
        End If
    Next kw

    MsgBox "OR検索ヒット数: " & hitAddrs.Count & "件"
End Sub

6-2. AND検索(両方の条件を満たすセルを探す)

「AとBの両方を含むセル」を探すAND検索は、Findで一方のキーワードのヒットを取得しつつ、InStr関数でもう一方のキーワードが含まれるかを追加チェックするパターンが最もシンプルです。

Sub AndSearch()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim keyword1 As String: keyword1 = "株式会社"  ' 条件1
    Dim keyword2 As String: keyword2 = "東京"       ' 条件2

    Dim rng As Range
    Dim firstAddr As String

    ' まずkeyword1でFindNextループ
    Set rng = ws.Columns("A").Find(
        What:=keyword1,
        LookAt:=xlPart,
        LookIn:=xlValues
    )

    If rng Is Nothing Then
        MsgBox "「" & keyword1 & "」が見つかりませんでした"
        Exit Sub
    End If

    firstAddr = rng.Address
    Dim hitCount As Long: hitCount = 0

    Do
        ' InStr で keyword2 も含まれているか確認(AND条件)
        If InStr(rng.Value, keyword2) > 0 Then
            hitCount = hitCount + 1
            rng.Interior.ColorIndex = 4  ' 緑でマーク
            Debug.Print "AND一致: " & rng.Address & " = " & rng.Value
        End If
        Set rng = ws.Columns("A").FindNext(rng)
    Loop While Not rng Is Nothing And rng.Address <> firstAddr

    MsgBox "AND検索ヒット数: " & hitCount & "件"
End Sub

📚 用語解説

InStr関数:ある文字列の中に別の文字列が含まれているか調べるVBA組み込み関数。InStr("株式会社東京", "東京")は、"東京"が何文字目から始まるかの位置番号を返す(この例では5)。含まれない場合は0を返す。InStr(...) > 0 でTrue/False判定ができる。AND検索に多用される。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 【重要】引数の設定が前回の値を引き継ぐ罠 ほとんどの入門記事が触れない、Find最大の落とし穴

VBAのFindメソッドで最も多くの人が嵌まる罠が、LookIn・LookAt・SearchOrder・MatchCase・MatchByteの5引数を省略すると、前回のFindまたはCtrl+F検索ダイアログの設定値がそのまま使われるという仕様です。

⚠️ 同じコードが「ある日は動き、ある日は動かない」原因はこれ

LookAt を省略したコードを書いたとします。ある日、手動でCtrl+Fを使って「セル内容が完全に一致するもの」を探したとします。その後にマクロを実行すると、LookAt が xlWhole(完全一致)になります。しかし別の日に Ctrl+F で「セルの内容の一部として検索」を使っていた場合は xlPart(部分一致)になります。全く同じコードなのに結果が変わるのはこのためです。

' ===== 問題のあるコード(LookAtを省略している) =====
Sub BadFind()
    ' LookAt を省略 → 前回の設定(Ctrl+FやFindの残存値)が使われる
    Dim rng As Range
    Set rng = Cells.Find(What:="東京都")
    If Not rng Is Nothing Then
        MsgBox "見つかった: " & rng.Value
    End If
End Sub

' ===== 安全なコード(引数を全部明示する) =====
Sub SafeFind()
    ' 全引数を明示 → 環境に左右されない安定したコード
    Dim rng As Range
    Set rng = Cells.Find(
        What:="東京都",
        LookIn:=xlValues,       ' ← 明示: セルの値を対象
        LookAt:=xlWhole,        ' ← 明示: 完全一致
        SearchOrder:=xlByRows,  ' ← 明示: 行ごとに検索
        MatchCase:=False,       ' ← 明示: 大文字小文字は区別しない
        MatchByte:=False        ' ← 明示: 全角半角は区別しない
    )

    If Not rng Is Nothing Then
        MsgBox "見つかった: " & rng.Value
    End If
End Sub

解決策は単純明快です。Findを使うときは省略せず全引数を明示的に指定するだけです。毎回5引数を書くのが面倒なら、ラッパー関数を作って引数のデフォルト値を明示的に固定する方法も有効です。

' ===== 引数明示の省力化: ラッパー関数を作る =====
' 毎回SafeFindを呼ぶだけでデフォルト引数が保証される
Function SafeFind(rng As Range, what As String, _
                  Optional lookAt As XlLookAt = xlWhole, _
                  Optional matchCase As Boolean = False) As Range
    Set SafeFind = rng.Find(
        What:=what,
        LookIn:=xlValues,
        LookAt:=lookAt,
        SearchOrder:=xlByRows,
        MatchCase:=matchCase,
        MatchByte:=False
    )
End Function

' 使い方(常に同じ引数設定が保証される)
Sub UseWrapper()
    Dim result As Range
    Set result = SafeFind(ActiveSheet.Columns("A"), "東京都")
    If Not result Is Nothing Then
        MsgBox "発見: " & result.Address
    End If
End Sub
代表菅澤 代表菅澤
これを知っているかどうかで、VBAエンジニアとしての信頼性が大きく変わります。特に「動いたり動かなかったりする」マクロは、たいていこの引き継ぎ問題が原因です。チームで共有するVBAコードでは特に重要な知識です。

08 複数シートをまたいだ検索の実装 全シート横断でキーワードを検索するテンプレートコード

Findメソッドは1つのRangeオブジェクト内しか検索できないため、ブック内の全シートを横断して検索したい場合は全シートをFor Eachで回しながらFindを呼ぶ設計が必要です。

Sub SearchAllSheets()
    Dim wb As Workbook
    Set wb = ThisWorkbook

    Dim searchWord As String
    searchWord = "東京"

    Dim ws As Worksheet
    Dim rng As Range
    Dim firstAddr As String
    Dim totalHits As Long
    totalHits = 0

    ' 全シートをループ
    For Each ws In wb.Worksheets
        Dim searchRange As Range
        Set searchRange = ws.Cells  ' シート全体を対象

        Set rng = searchRange.Find(
            What:=searchWord,
            LookIn:=xlValues,
            LookAt:=xlPart,
            SearchOrder:=xlByRows,
            MatchCase:=False,
            MatchByte:=False
        )

        If Not rng Is Nothing Then
            firstAddr = rng.Address

            Do
                totalHits = totalHits + 1
                Debug.Print "【" & ws.Name & "】" & rng.Address & ": " & rng.Value

                ' 検索結果をハイライト
                rng.Interior.ColorIndex = 6  ' 黄色

                Set rng = searchRange.FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddr
        End If
    Next ws

    MsgBox "全シート検索完了: 「" & searchWord & "」が " & totalHits & "件見つかりました"
End Sub
For Each ws In
Worksheets

全シートを
1枚ずつ処理
ws.Cells.Find(...)
そのシートで
最初の1件を検索
FindNextループ
Nothingか
先頭に戻るまで
繰り返す
結果を記録・処理
シート名・アドレス・
値をDebug.Print等
で出力
次のシートへ
全シート終わるまで
継続
💡 特定シートのみ検索対象にしたい場合

For Each ws In wb.Worksheets ループ内で If ws.Name = "Sheet1" Or ws.Name = "Sheet2" Then ... のように条件を追加するか、検索対象シートの配列を予め定義しておくとすっきりします。非表示シートを除外したい場合はIf ws.Visible = xlSheetVisible Thenを追加します。

09 実務ユースケース別テンプレートコード集 商品コード検索・名簿管理・重複チェックなど実務に役立つコード

9-1. 商品コード検索→隣のセルの値を取得

' 商品コードでA列を検索し、同じ行のB列(価格)を取得する
Function GetPriceByCode(productCode As String) As Long
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("商品マスタ")

    Dim rng As Range
    Set rng = ws.Columns("A").Find(
        What:=productCode,
        LookAt:=xlWhole,   ' 商品コードは完全一致
        LookIn:=xlValues,
        MatchCase:=False,
        MatchByte:=False
    )

    If rng Is Nothing Then
        GetPriceByCode = -1  ' 見つからない場合は-1を返す
    Else
        GetPriceByCode = rng.Offset(0, 1).Value  ' B列(1つ右のセル)を取得
    End If
End Function

' 使い方
Sub SampleUsage()
    Dim price As Long
    price = GetPriceByCode("A-001")
    If price = -1 Then
        MsgBox "商品コードが見つかりません"
    Else
        MsgBox "価格: ¥" & Format(price, "#,##0")
    End If
End Sub

9-2. 重複データの検出・ハイライト

' A列で重複している値をすべて黄色でハイライトする
Sub HighlightDuplicates()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim i As Long
    For i = 1 To lastRow
        Dim cellVal As String
        cellVal = ws.Cells(i, 1).Value
        If cellVal = "" Then GoTo NextRow

        ' 同じ値が2件以上あるかFindNextで確認
        Dim rng As Range
        Dim firstAddr As String
        Dim hitCount As Long
        hitCount = 0

        Set rng = ws.Columns("A").Find(
            What:=cellVal,
            LookAt:=xlWhole,
            LookIn:=xlValues,
            MatchCase:=False,
            MatchByte:=False
        )

        If Not rng Is Nothing Then
            firstAddr = rng.Address
            Do
                hitCount = hitCount + 1
                Set rng = ws.Columns("A").FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddr
        End If

        ' 2件以上あれば重複と判断して全件ハイライト
        If hitCount >= 2 Then
            Set rng = ws.Columns("A").Find(
                What:=cellVal, LookAt:=xlWhole, LookIn:=xlValues,
                MatchCase:=False, MatchByte:=False
            )
            firstAddr = rng.Address
            Do
                rng.Interior.ColorIndex = 6  ' 黄色
                Set rng = ws.Columns("A").FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddr
        End If

        NextRow:
    Next i

    MsgBox "重複チェック完了"
End Sub

📚 用語解説

Offset(row, column):Rangeオブジェクトのプロパティで、指定したセルから相対的にずれた位置のセルを返す。rng.Offset(0, 1)は同じ行の1列右、rng.Offset(1, 0)は1行下のセル。Findで見つかったセルの隣の列の値を取得したい場合(商品コード→価格、名前→電話番号 等)によく使う。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 Claude CodeでFind検索マクロを自動生成する 要件を日本語で説明するだけで即座にVBAコードを得る方法

ここまでFindメソッドの詳細な仕様とコードパターンを解説してきましたが、正直なところ、引数を毎回書くのは面倒ですし、FindNextのループ構造も毎回イチから書くのは非効率です。

こういった定型コードの生成はClaude Codeに任せるのが最も効率的です。「A列で部分一致検索し、ヒットした行を全部リスト化したい」のように日本語で要件を説明するだけで、引き継ぎ問題を考慮した安全なコードが即座に返ってきます。

ユースケースClaude Codeへの指示例
基本的なFindコード作成「VBAでA列から"東京都"を完全一致検索し、見つかった行番号とセル値をMsgBoxで表示するコードを書いて」
FindNextループ「VBAでSheet1のA列から"株式会社"を部分一致で全件検索し、見つかったセルをすべて黄色にハイライトするコード。引数の引き継ぎ問題を考慮して全引数を明示したコードで」
複数シート横断「Excelブック内の全シートから"2026"という文字を検索し、ヒットした行をSheet名・アドレス・値の形で別シートに一覧化するVBAコードを書いて」
既存コードの改善「このVBAコードのFindメソッドで引数を省略している箇所をすべて明示的な引数に直して。特にLookIn・LookAt・MatchCaseを追加して。[コードを貼り付け]」
要件を日本語で説明
「A列で部分一致検索
して全件取得したい」
Claude Codeが
コード生成

安全な引数設定と
ループ構造を含む
コードが即時返却
VBEに貼り付け
Ctrl+Aで選択して
既存コードを
置き換え
動作確認
F5で実行して
問題なければ
完成
代表菅澤 代表菅澤
AI鬼管理では、VBAのFindメソッドを使った業務マクロの作成・改善にClaude Codeを活用しています。特に「引数を全部明示して、引き継ぎ問題が起きないようにして」と一言添えるだけで、安全なコードを生成してくれます。VBAコードをClaude Codeに任せてから、開発時間が体感で5分の1になりました。
AI鬼管理山崎 AI鬼管理山崎
私がよく使うのは「既存のVBAコードを貼り付けて、FindメソッドのLookAt・LookInを全部明示的に書き直して」という指示です。古いマクロの引き継ぎ問題を一気に直せるので、引き継ぎコードの整備に重宝しています。

11 まとめ:VBA Findメソッド完全習得のポイント 引数の明示・FindNextループ・引き継ぎ対策の3点セット

✔️FindメソッドはWhat以外の省略可能引数9個があり、LookIn・LookAt・MatchCase等は明示推奨
✔️完全一致はLookAt:=xlWhole、部分一致はLookAt:=xlPart。省略は引き継ぎ問題の原因
✔️FindNextで複数ヒット検索する際はfirstAddrによる無限ループ対策が必須
✔️LookIn・LookAt・SearchOrder・MatchCase・MatchByteは前回設定を引き継ぐため常に明示する
✔️複数シート横断はFor Each ws + 各シートでFindNextループの組み合わせで実現
✔️繰り返し使うFindはラッパー関数で引数のデフォルトを固定するとチームで安全に使える
✔️Claude Codeに要件を日本語で指示すれば、引き継ぎ問題を考慮した安全なコードが即座に得られる

VBA作業の自動化・業務効率化をAIで一気に進めたい方へ

FindメソッドやVBAマクロは「書けるようになること」より、「業務に組み込んで動かし続けること」の方が価値があります。
AI鬼管理では、ExcelVBA・Python・Google Sheetsを使った業務自動化の設計・実装支援を行っています。

代表菅澤 代表菅澤
「Findのコードは書けるようになった。でも実際の業務にどう組み込めばいいか分からない」という相談は非常に多いです。まずは無料相談で現在の業務フローをお聞かせください。どこをどう自動化するかを一緒に整理します。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. VBAのFindメソッドとForループはどちらが速いですか?

A. 大量データ(数千行以上)ではFindメソッドの方が圧倒的に高速です。ForループはすべてのセルをVBA側で1件ずつ評価しますが、FindメソッドはExcelの内部検索エンジンを直接呼び出すため、数十倍のスピード差が出ることがあります。ただし少量データ(数十〜数百行)では実用上の差はほぼありません。シンプルさを優先するならForループ、速度を優先するならFindという使い分けが目安です。

Q. LookIn:=xlFormulasを使うのはどんな場面ですか?

A. セルに入力された数式のテキスト自体を検索したい場合です。例えば「SUM」という関数を含む数式が入っているセルを探したい場合や、特定のシート名を参照している数式を探したい場合(「Sheet2!」を含む数式を検索等)に使います。通常の用途(表示値での検索)ではxlValuesを使い、数式を検査・分析する特殊なマクロではxlFormulasを使うのが一般的です。

Q. FindNextでループすると最後の1件が2回処理されることがありますが、どうすれば防げますか?

A. firstAddr(最初に見つかったセルのアドレス)との比較をループ条件に入れることで防げます。標準的な書き方は「Loop While Not rng Is Nothing And rng.Address <> firstAddr」です。FindNextはループの末尾で次を取得→先頭に戻ったセルと firstAddr が一致したらループを抜ける、という流れです。条件の場所をLoopの後(Do〜Loop While)に書くことで、1件目の処理と終了判定が正しく分離されます。

Q. Findで全角・半角の区別なく検索するにはどうすればいいですか?

A. MatchByte:=False を明示することで全角・半角を区別しない検索になります(False=区別しない)。省略すると前回の設定が引き継がれるため、必ず明示することを推奨します。大文字・小文字も区別しない場合はMatchCase:=False を同時に指定します。

Q. FindとLike演算子(正規表現)の違いは何ですか?

A. Findのワイルドカード(*、?)は簡単な文字列パターンマッチには使えますが、正規表現ほど柔軟ではありません。VBAで正規表現を使いたい場合は、Microsoft VBScript Regular Expressionsオブジェクト(RegExp)を参照設定して使います。Findは「含む/含まない」「特定の文字で始まる」程度のシンプルな検索に最適で、複雑なパターン(「3桁の数字に続くスペース」等)が必要な場合はRegExpの方が適切です。

Q. Claude CodeにVBAのFindコードを書いてもらうとき、どう指示すると良いですか?

A. 検索対象(どのシートのどの列/範囲か)・検索条件(完全一致か部分一致か)・検索した後にしたいこと(ハイライト/削除/別シートに転記/値を返す等)の3点を日本語で説明するのが最も効率的です。例:「Sheet1のA列で"2026"を含む部分一致で全件検索し、見つかった行のB列の値をSheet2のA列に順番に転記するVBAコードを書いて。引数の引き継ぎ問題が起きないよう全引数を明示したコードで」というように指示するとすぐに使えるコードが返ってきます。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。