この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。2026年10月17日にMicrosoft公式のAPI・関数仕様を参照し、架空の入力を使った操作と条件の違いを整理しました。検証ステータス:📘 公式仕様確認済み・対象Excelの実機評価は未実施
まず試す:3操作で折り返しを観察する
新しいExcelデスクトップ版のブックで「検索練習」シートを作り、A2にP101、A3にP102、A4にP101、A5にP103を入力します。
Daily Codeの読取り専用サンプルを標準モジュールへ貼り、マクロを許可できる練習用環境だけで
ListMatchingCellsを実行します。VBAエディターのイミディエイトウィンドウでA2とA4の2件が表示され、同じセルが無限に繰り返されないか確認します。これは期待結果であり、本稿の制作環境ではExcelを実行していません。
| 練習用データの変更 | 期待する一致件数 |
|---|---|
| A2とA4がP101 | 2件 |
| A4だけP104へ変更 | 1件 |
| A2もP104へ変更 | 0件 |
対応環境・できること・制限事項
| 項目 | 前提 |
|---|---|
| 対象 | Windows向けデスクトップExcel、VBAを実行できる環境。練習用ブックの「検索練習」シートだけを読む。Excel for the webでVBAは実行できない。 |
| 主題 | Excel VBAのRange.FindNextで全一致を列挙し最初のセルで停止する |
| 安全性 | 新規の練習用ブックで確認。業務データの更新や削除を行わない |
| 制約 | Officeバージョン、マクロ設定、数式機能とデータ型を事前に確認 |
| 仕様確認日 | 2026-10-17(JST) |
Range.Findで最初の一致が見つかった場合、FindNextを繰り返すことで二つ目以降の一致も探せる。ただしFindNextは検索範囲の終端まで進むと先頭へ折り返すため、終了条件を決めなければ同じセルを繰り返し処理してしまう可能性がある。最初のセルのアドレスを覚え、読み取り専用で件数を数える方法を整理する。
最小の確認コード・数式
次は仕組みを理解するための短い抜粋です。VBAの標準モジュールで使う場合は変数や処理をSub内へ配置します。実行用の完全版とエラー処理はリンク先のDaily Codeを利用してください。
Dim searchRange As Range, hit As Range, firstAddress As String
Set searchRange = ThisWorkbook.Worksheets("検索練習").Range("A2:A30")
Set hit = searchRange.Find(What:="P101", _
After:=searchRange.Cells(searchRange.Cells.Count), _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not hit Is Nothing Then
firstAddress = hit.Address
Do
Debug.Print hit.Address(False, False)
Set hit = searchRange.FindNext(hit)
If hit Is Nothing Then Exit Do
Loop While hit.Address <> firstAddress
End If
実機でのコンパイル・実行または数式評価は未実施です。表示結果は各自のExcelの状態に依存するので、下記の入力条件を揃えてから確認してください。
最初の1件だけでは重複が分からない
商品コードP101がA2にあるからといって、A4にも同じコードがないと保証できるわけではない。マスタ表で重複を禁止している場合、最初の一致行を取得して処理を終了するマクロでは不正な重複を見逃してしまう。そこで検索範囲全体を対象にして一致セルをすべて列挙し、件数を数える。検索する対象を決めないままシート全体へ広げると、脚注や別表に書かれた同じ文字まで結果に含まれてしまうので、対象列と行範囲を先に定義する。
Findは検索の開始位置を返す
MicrosoftのRange.Findは一致するセルをRangeとして返し、見つからない場合はNothingとなる。検索対象の書式や値によって結果が変わるため、LookInとLookAtの条件を明示したい。たとえば商品コードP101をP1010と区別する必要があれば、xlWholeでセル全体の一致を指定する。xlPartなら一部の文字列が同じだけでも候補になるので、検索意図が異なる。
FindNextが折り返す仕組み
FindNextは前回見つけたセルを手掛かりに次を探すが、最後へ到達したら検索範囲の先頭へ戻る。この動作はExcel VBAの公式説明に記載されている。したがってFindNextでNothingが返ることだけを終了条件にすると、条件次第では最初の一致へ戻って同じ結果を何度も表示してしまう。最初に一致したセルのAddressをfirstAddressへ保存し、次のセルがそのアドレスになった時点で停止する方法が分かりやすい。
練習表の条件を固定する
新しいブックへ「検索練習」シートを作り、A2=P101、A3=P102、A4=P101、A5=P103を入力する。コードの検索範囲はA2:A30であり、上記二つのP101以外に値を入れない。サンプルと同じく検索開始位置をA30の直後に指定した場合、最初の結果がA2、次がA4、件数2になる想定だ。実際のExcelでコードを実行した観測ではない。必要なセルが存在するか、シート名が一致しているか、対象が現在のブックではなくThisWorkbookであるかを最初に確認する。
検索ダイアログとの設定の共用
MicrosoftのRange.Findの公式資料では、一部の検索引数はExcelの検索ダイアログに残る設定と共用されると説明される。人が手動検索で『一部一致』へ変更していた場合、引数省略のマクロが別の結果を返す可能性がある。実務用の再利用版ではAfter、LookIn、LookAt、SearchOrder、SearchDirectionなどを必要に応じて明示し、前の作業に依存しないようにする。最小例だけをそのまま本番マクロに貼り付ける前には、公開サンプルの完全版を確認する。
一致0件と一致1件も試す
A4のP101をP104に変更すれば一致はA2だけになり、最初の一致へ折り返した時点で終了する想定である。A2もP104へ変更すれば一致なしとなるはずだ。Nothingだった場合にAddressを参照すると実行時エラーになるため、最初のFindの直後に必ず判定を入れる。ゼロ件、一件、複数件で同じコードが適切に終了することを確かめると、ループの境界が理解しやすい。
データを更新しない理由
公式のサンプルには見つけたセルを書き換える例もあるが、重複調査を目的とする場合は読取りだけで十分である。値の置換や重複行の削除を同じ処理へ組み込むと、検索中に対象範囲が変わり結果が変化する危険がある。今回のコードはDebug.Printで場所を表示するのみとし、ブックの保存も実行しない。重複が見つかったら自動削除せず、コード体系の管理者へ確認する。
セル番号と業務上の判断
一致したセルのAddressが得られても、その行をどのように扱うかは別問題である。マスタとして禁止される重複なら警告し、履歴表で同じコードが何度も現れるのが正常なら更新日などの別項目で抽出する。検索結果の最初の行だけを最新と決めつけてはいけない。行順が変わる場合の挙動、数式結果の検索、フィルター非表示行を含めるかといった条件は業務仕様に記す。
仕事へ応用するとき
FindとFindNextの組み合わせで大事なのは、検索対象・一致条件・終了条件の三つを明示することである。読取り専用の練習データで0件・1件・複数件を試し、どの段階でも無限ループや思わぬ更新が起きないようにする。 コピーして使えるコードの形だけでなく、どの入力を正しいと判断するか、どこを出力先にするか、失敗時に何を変更しないかを明確にします。公開用のダミーデータだけで確認し、実ファイルを処理する段階へ進む場合には社内の承認とバックアップを検討してください。
検索の途中で結果を書き換えない設計
全一致を列挙しながら見つけたセルを削除したり、検索値を変更したりすると、FindNextで次にどのセルを取得するかが変わり得る。そこで最初の工程はアドレスと件数の収集だけにし、修正が必要なら一覧を確認してから別の処理に渡す。最初に保存したAddressはループの終了条件として利用する情報でもあるため、検索途中で行を挿入して位置をずらす構成は避けたい。
対象列に数式が入っている場合は、表示された値を探すか、数式文字列を探すかで一致するセルが違う可能性がある。LookIn=xlValuesとxlFormulasの選択を明示し、何を検出したいかを業務上の用語で定義する。例えば『表示されている商品コードの重複』なら値が基準になり、数式の同一性を調査したいなら別の条件が必要だ。検索方法の選択は処理速度だけでなく、重複の定義にも影響する。
公式情報・一次情報
GitHubサンプル
再利用用の教材版にはコメントや失敗時の扱いを含めています。GitHubに保存済みですが、Excelで実行・評価した結果を捏造して掲載してはいません。
