Excel VBA Findの結果が変わる原因―Copilot生成コードで省略しない検索条件

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。 この記事はChatGPTが作成し、同じ実行内の5役セルフQA(構成、初心者UX、公式出典・技術事実、プライバシー・安全、編集品質・重複)で確認しています。Microsoft公式のRange.Find/FindNext仕様とMicrosoft Copilot Chatの利用条件を確認し、架空の注文番号で検算できる形に整理しました。別AIによる独立審査、Excel実機、Copilot Chat実操作は行っていません。

検証ステータス:📘 公式情報確認済み・Excel/Copilot実機未確認

公式仕様確認日:2026年10月29日(JST)

対応環境・入口・制限事項

項目今回の条件・注意
ExcelWindows版ExcelデスクトップアプリでVBAを使用/Excel for the webでVBAを実行する手順ではない。マクロポリシーは組織ごとに確認
VBAの入口Alt+F11でVBEを開き、標準モジュールへ貼り付け/実データではなく新規テストブックを使う。マクロ有効化を無理に回避しない
AI製品職場用Microsoft Copilot Chat/個人向けCopilot、Excel内Copilot、Microsoft Copilot追加ライセンスの体験と区別する
アカウントMicrosoft Entra IDの職場・学校アカウント/Copilot Chatを利用できる対象Microsoft 365契約、テナント設定、ネットワーク許可が必要。個人アカウントとはデータと保護を分ける
Copilotの入口copilot.cloud.microsoftなど組織が許可した入口/画面、モデル、引用、Web検索の可否は契約・テナント・時期で異なる
今回AIへ渡す情報下記の架空コードと架空の注文番号だけ/実顧客名、実注文番号、勤務先情報、ブック、秘密情報は送らない
実行状況公式仕様を確認した検証計画/VBA出力、検索ダイアログとの相互作用、Copilot回答は未実測

まず試す:A-102を探す

  1. 新しいテスト用ブックのSheet1に、後述の架空注文表を入力します。

  2. FindOrderIdSafelyを標準モジュールに貼り付けて実行します。

  3. Ctrl+Gでイミディエイトウィンドウを開き、一致: A3を確認します(実機未確認の期待値)。

ここを見る: LookAt:=xlWholeはA3の完全一致、xlPartではA3とA4が候補になります。変更前後の違いを後半で確かめます。

VBAのRange.Findは短く書けるため、Copilotへ「A列から注文番号を探すコードを書いて」と依頼すると、Whatだけを指定した例が返ることがあります。問題は、短いコードが常に同じ条件で検索するとは限らない点です。

Microsoft Learnによれば、LookIn、LookAt、SearchOrder、MatchByteの設定は保存されます。VBA側で省略すると保存値が使われ、検索ダイアログで設定を変えた場合もその値へ影響します。昨日まで見つかった文字列が突然Nothingになる現象を、データ破損やPC差と決めつける前に、検索条件の省略を確認する必要があります。

結論:検索条件はコード側で明示する

再現性を上げる要点は次の3つです。

  1. LookIn、LookAt、SearchOrder、MatchByteを省略しない。

  2. After、SearchDirection、MatchCase、SearchFormatも目的に合わせて明示する。

  3. 複数件を探すときは、最初のアドレスを保存し、FindNextが先頭へ戻ったら止める。

とくにLookAt:=xlWholeはセル全体の完全一致、LookAt:=xlPartは部分一致です。両者を無意識に切り替えると、同じ検索値でも件数が変わります。

架空の注文一覧を用意する

新しいブックのSheet1へ、次の値を入力します。すべて架空です。

セル注文番号
A1注文番号
A2A-101
A3A-102
A4XA-102
A5A-103

完全一致でA-102を探すとA3だけ、部分一致ならA3とA4が候補になる設計です。最初から業務ブックで試すと、検索条件以外に数式、結合セル、非表示行、データ型などの要因が混ざります。まず4行だけのテスト表に切り分けます。

最小例:完全一致を1件探す

次のコードを標準モジュールへ貼り付けます。これは未実行の検証用コードです。

Option Explicit

Public Sub FindOrderIdSafely()
    Dim ws As Worksheet
    Dim area As Range
    Dim hit As Range

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set area = ws.Range("A2:A5")

    ' 検索ダイアログの保存値に依存しないよう、条件を明示する。
    Set hit = area.Find( _
        What:="A-102", _
        After:=area.Cells(area.Cells.Count), _
        LookIn:=xlValues, _
        LookAt:=xlWhole, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        MatchByte:=False, _
        SearchFormat:=False)

    If hit Is Nothing Then
        Debug.Print "一致なし"
    Else
        Debug.Print "一致: " & hit.Address(False, False)
    End If
End Sub

期待する観測は一致: A3です。Afterは「そのセルの次から検索する」位置を示します。範囲末尾を指定し、xlNextで進めることで、最初の候補から確認する意図をコードに残しています。ただし、これは仕様から組み立てた期待値であり、この記事の作成時点ではExcelで実測していません。

hit Is Nothingを先に判定するのも重要です。一致しないA-999へ変えたとき、いきなりhit.Addressを参照すると実行時エラーになります。「一致なし」は正常な業務結果になり得るため、例外ではなく分岐として扱います。

1条件だけ変える:完全一致を部分一致にする

同じデータ、同じ検索値のまま、次の1か所だけを変えます。

LookAt:=xlPart

期待する候補はA3のA-102とA4のXA-102です。ここで件数が1から2へ変われば、データやPCの違いではなく、完全一致/部分一致という条件差が結果を変えることを観察できます。

失敗例は、検索ダイアログで完全一致へ切り替えた後、コードではLookAtを省略することです。その場合、前回の保存設定を使ってしまい、作者の想定した部分一致にならない可能性があります。Microsoft公式が「問題を避けるには毎回明示する」と案内する理由です。

複数件はFindNextの周回を止める

FindNextは検索範囲の末尾へ達すると先頭へ戻ります。停止条件がないDoループは、同じセルを繰り返して終わらないおそれがあります。

Public Sub FindAllOrderFragments()
    Dim area As Range
    Dim hit As Range
    Dim firstAddress As String
    Dim foundCount As Long

    Set area = ThisWorkbook.Worksheets("Sheet1").Range("A2:A5")
    Set hit = area.Find( _
        What:="A-102", _
        After:=area.Cells(area.Cells.Count), _
        LookIn:=xlValues, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        MatchByte:=False, _
        SearchFormat:=False)

    If hit Is Nothing Then
        Debug.Print "一致なし"
        Exit Sub
    End If

    firstAddress = hit.Address
    Do
        Debug.Print hit.Address(False, False)
        foundCount = foundCount + 1

        Set hit = area.FindNext(After:=hit)
        If hit Is Nothing Then Exit Do
    Loop While hit.Address <> firstAddress

    Debug.Print "件数: " & foundCount
End Sub

期待する観測はA3、A4、件数: 2です。Microsoft Learnは、周回した検索を止めるため、最初に見つかったセルのアドレスを保存し、後続のアドレスと比較するよう説明しています。

実務コードでは検索中にセル値を書き換える場合にも注意が必要です。対象範囲を変更すると次の一致位置が変わる可能性があります。まず読み取りだけで全件を確認し、変更処理は別段階に分ける方が切り分けやすくなります。

Copilot Chatへ貼り付ける検算プロンプト

次は架空コードだけを使う質問例です。

次の架空Excel VBAコードをレビューしてください。
Range.Findの引数を省略すると結果が変わり得る理由を、Microsoft Learnの
Range.FindとFindNextを根拠に説明してください。

確認項目:

- LookIn、LookAt、SearchOrder、MatchByteの保存仕様

- 検索ダイアログとの相互作用

- Afterの意味

- Nothingの安全な処理

- FindNextが先頭へ戻ったときの停止条件

コードを実行したとは書かず、未確認の部分は未確認と明記してください。
回答には一次資料URLを付け、確定仕様・推測・追加検証を分けてください。
実顧客データや実ファイルはありません。

Copilot回答では、LookAtだけを説明して終わっていないか、4つの保存設定を列挙できているか、FindNextの周回を認識しているかを確認します。URLが付いても内容を自分で開いて照合します。回答が「このコードなら必ず安全」と断定した場合は、Excel実行をしていない点や、結合セル・複数範囲・検索中の変更を未確認である点を差し戻します。

よくある失敗と理由

省略した方が短くて読みやすい

短くても、保存済み設定が隠れた入力になります。担当者や直前操作によって結果が変わるコードは、定型業務では保守しにくくなります。引数名を含めて明示すると、レビュー時に完全一致、検索方向、大文字小文字の扱いを確認できます。

SearchFormatを忘れる

書式検索を意図しないならSearchFormat:=Falseを明示します。書式まで検索条件に含める場合は、どの書式を準備したかを別途管理します。今回の注文番号検索では書式を条件にしません。

完全一致なのにA4も見つかる

LookAt:=xlPartになっている可能性を確認します。A-102はXA-102の一部でもあるため、部分一致では両方が候補です。データを削除して合わせるのではなく、検索要件を決め直します。

FindNextが終わらない

検索は先頭へ戻る仕様です。最初のアドレスを保存せず、Nothingだけを終了条件にすると、同じ一致を巡回し続ける可能性があります。周回停止条件をテストします。

Copilotが書いたから検証不要

Copilotは下書きとレビュー観点の整理に使えますが、Excelの状態や業務要件を自動で保証しません。架空の最小表で、完全一致、部分一致、一致なし、複数一致をそれぞれ実行してから業務ブックへ移します。

実務での採用判断

1件だけを探すなら、引数を明示したFindとNothing分岐を使います。複数件なら最初のアドレスを保存して周回を止めます。検索対象が表のキーで、同じ値を何度も参照するなら、Dictionaryやワークシート関数の方が目的に合う場合もあります。

採用前の確認項目は、対象範囲、値と数式のどちらを見るか、完全一致か部分一致か、大文字小文字、複数一致時の扱い、一致なしの業務処理です。速度だけで手段を決めず、同じ入力で同じ結果を再現できることを先に確認します。

公開サイトの限定検索では、Range.Findへ触れるDictionary高速化記事、Rangeオブジェクト解説、XLOOKUPとVBA検索の概説は見つかりましたが、「保存される検索条件と検索ダイアログ」「FindNextの周回停止」を中心にする同一検索意図は確認できませんでした。本稿はこの限定された技術トラブルに絞るNEW記事と判断します。ただし、公開記事・非公開記事・翻訳版を認証付きで全件照合したとは記録しません。

まとめ

Range.Findの結果が急に変わったら、最初に検索条件の省略を疑います。LookIn、LookAt、SearchOrder、MatchByteは保存され、検索ダイアログとも相互に影響します。コード側で条件を明示し、一致なしを安全に処理し、FindNextでは最初のアドレスへ戻った時点で止めます。

Copilotへ相談するときも実データは渡さず、架空コードで「どの条件を明示したか」を検算します。AIの説明、Microsoft公式仕様、Excelの実測を分けて記録することが、再現性のある業務マクロへの近道です。

公式情報・一次情報

GitHubサンプル

サンプルには、既存シートを上書きしない架空データ作成、完全一致、部分一致、0件、FindNextの周回停止、期待ログを含めています。Microsoft公式仕様との静的照合は実施しましたが、Excel/VBA実機では未実行です。

文書情報

記事タイトル
Excel VBA Findの結果が変わる原因―Copilot生成コードで省略しない検索条件
作成日
更新日
Source URL
https://papanda925.com/?p=18362

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました