XMATCH:MATCHの完全上位互換。完全一致がデフォルトになり「0」の書き忘れから解放
💡 やりたいこと
リストの中から特定の値を探し、それが「上から(または左から)何番目にあるか」の相対的な位置(数値)を安全・確実に取得したい。
新関数での解決法:XMATCH
XLOOKUPの「検索機能のみ」を抜き出し、位置(行番号や列番号)を返す関数です。MATCH関数が抱えていた最大のトラップ「第3引数(0) の指定忘れ問題」を解決しました。
意味:1行目の中から「当月売上」という文字を探し、左から何番目にあるか(列番号)を返す。
これだけで「完全一致検索」になります。
旧来の
=MATCH("売上", A1:Z1) は、第3引数である [照合の種類] を省略すると「1(近似値、昇順ソート必須)」という謎の挙動がデフォルトになっていました。初心者が 0(完全一致)を指定し忘れた結果、「見つからないのになぜか隣の列の番号が返ってきて、後続のINDEX関数で全く違う数値を取得し、誤ったレポートが作成される」という大事故が世界中の実務で多発していました。XMATCHでは、XLOOKUP同様「省略すると完全一致」という安全な仕様に修正されたため、このトラップを踏むことが物理的になくなりました。
後ろからの検索とバイナリ検索
XLOOKUPと同様に、検索モード で -1 を指定すれば「末尾から先頭への検索(最後の履歴を取得する際に行番号を拾う)」、2 を指定すれば「バイナリ検索」が使えます。
旧バージョンでの代替法(MATCH)
, 0 は絶対に忘れないこと!省略すると近似値検索になり、並び順次第で大事故に直結します。
🔍 MATCH vs XMATCH ── 何がどう変わったのか徹底比較
① 全体像:7つの決定的な違い
| 比較項目 | MATCH(旧) | XMATCH(新) | |
| 1 | デフォルトの一致モード | 1(近似値・昇順前提) ← 事故の温床 🔥 |
0(完全一致) ← 安全設計 ✅ |
| 2 | 一致モードの番号体系 | 1 = 以下, 0 = 完全, -1 = 以上 | -1 = 以下, 0 = 完全, 1 = 以上, 2 = ワイルドカード |
| 3 | 近似値検索のソート要件 | 昇順/降順に事前ソート必須 | ソート不要(未整列でもOK) |
| 4 | 逆方向(末尾→先頭)検索 | ❌ 不可 | ✅ 検索モード -1 で対応 |
| 5 | バイナリ検索 | ❌ 不可 | ✅ 検索モード 2 / -2 で対応 |
| 6 | 正規表現(Regex) | ❌ 不可 | ✅ 一致モード 3(一部の対応環境のみ。利用可否は要確認) |
| 7 | 対応バージョン | Excel 97 以降すべて | Excel 2021 / 2024 / Microsoft 365 など |
MATCHは「わかっている人が正しく設定すれば動く関数」。XMATCHは「何も考えずに書いても安全に動く関数」。
デフォルトが完全一致に変わった一点だけでも、乗り換える価値があります。
② 最大の違い:デフォルト挙動の図解
以下の図は、まったく同じデータに対して「第3引数を省略した」場合に MATCH と XMATCH がどう振る舞うかを示しています。
| A | B | |
| 1 | 社員名 | 売上 |
| 2 | 青木 | 120 |
| 3 | 伊藤 | 340 |
| 4 | 加藤 | 210 |
| 5 | 佐藤 | 500 |
| 6 | 中村 | 180 |
| 7 | 山田 | 410 |
このデータで「中村」を検索してみます。
第3引数を省略 → デフォルト 1(近似値・昇順ソート前提)になる。
内部でバイナリ検索的なアルゴリズムが走り、「中村」以下で最も近い値として
→ 返り値は 5(=「佐藤」の位置)🔥
「中村」を探しているのに「佐藤」の位置が返る。後続の INDEX で佐藤の売上 500 を取得してしまい、レポートが破綻します。
第3引数を省略 → デフォルト 0(完全一致)になる。
A2:A7 を先頭から順に走査し、A6 で「中村」を発見。
→ 返り値は 5(= A2 から数えて5番目 = 正しく「中村」の位置)✅
MATCHの「5」は佐藤の位置(誤り)。XMATCHの「5」は中村の位置(正解)。
このようにエラーにならず間違った値が返るのが最も危険な事故パターンです。#N/A が出ればまだ気づけますが、「もっともらしい数値」が返るため発見が遅れます。
③ 引数体系の完全対比図
MATCHとXMATCHでは引数の「番号 → 意味」の対応が逆転している部分があるので要注意です。
| MATCH(旧)の照合の種類(第3引数) | XMATCH(新)の一致モード(第3引数) | |||||
| 値 | 意味 | ソート | 値 | 意味 | ソート | |
| 1(既定) | 検索値以下の最大値 | 昇順必須 | 0(既定) | 完全一致 | 不要 | |
| 0 | 完全一致 | 不要 | -1 | 完全一致 or 次に小さい値 | 不要 | |
| -1 | 検索値以上の最小値 | 降順必須 | 1 | 完全一致 or 次に大きい値 | 不要 | |
| ─ | 2 | ワイルドカード(*, ?, ~) | 不要 | |||
| ─ | 3 | 正規表現(一部の対応環境のみ) | 不要 | |||
MATCHの
1 は「以下の最大値(昇順)」だが、XMATCHの 1 は「以上の最小値」。MATCHの
-1 は「以上の最小値(降順)」だが、XMATCHの -1 は「以下の最大値」。MATCH → XMATCH に書き換える際、近似値検索の番号はそのまま置き換えると逆の結果になります。
④ XMATCHにしかできないこと
🔄 逆方向検索(最後に一致した位置を取得)
たとえば「担当:田中」が複数行ある場合に、最後の田中の位置を取りたいケースです。
| A | B | |
| 1 | 日付 | 担当 |
| 2 | 4/1 | 田中 |
| 3 | 4/2 | 鈴木 |
| 4 | 4/3 | 田中 |
| 5 | 4/4 | 佐藤 |
| 6 | 4/5 | 田中 |
| 7 | 4/6 | 伊藤 |
MATCHでは「最後の一致」を取得するために LOOKUP(1,1/COUNTIF(...),...) のような裏技が必要でしたが、XMATCHなら第4引数に -1 を入れるだけで完了します。
⚡ バイナリ検索(大規模データの高速化)
数万行〜数十万行のデータで位置を検索する場合、通常の先頭からの線形検索では時間がかかります。データが昇順(または降順)にソートされている場合、バイナリ検索を使うことで劇的に速くなります。
データが正しくソートされていない状態でバイナリ検索を使うと、エラーにならず間違った結果が返ります。必ずソート済みであることを確認してから使ってください。
🃏 ワイルドカード専用モード
MATCHでもワイルドカード(*, ?)は使えましたが、それは「完全一致モード(0)にした場合のみ」で、検索値にワイルドカード文字を含めるという暗黙のルールでした。XMATCHでは一致モード 2 を明示的に指定する専用モードとして独立しています。
MATCHでは
=MATCH("東京*", A1:A100, 0) と書くと、完全一致モードなのにワイルドカードが動作するという「二重人格」状態でした。XMATCHでは完全一致(0)とワイルドカード(2)が明確に分離されたため、「* を文字として完全一致したい」場合もモード 0 で安全に処理できます。
🧩 正規表現マッチ(一部の対応環境のみ)
一致モード 3 を指定すると、検索値に正規表現(Regex)パターンを使える環境があります。Microsoft 365の更新チャネルやExcel 2024のビルドによって利用可否が分かれるため、実務では =XMATCH( 入力時のヘルプや実機で確認してください。ワイルドカードでは表現できない複雑なパターンマッチングが可能です。
「大文字3文字 → 数字2〜4桁 → 大文字2文字」のパターンに一致する最初のセル位置を返す。
⑤ 第4引数「検索モード」の全体像
XMATCHにだけ存在する第4引数は、検索の方向とアルゴリズムを制御します。
| 検索モード | 方向 | 説明 | ソート要件 |
| 1(既定) | 先頭 → 末尾 | 通常の線形検索。最初に一致した位置を返す | 不要 |
| -1 | 末尾 → 先頭 | 逆方向の線形検索。最後に一致した位置を返す | 不要 |
| 2 | バイナリ(昇順) | 高速バイナリ検索。大量データ向け | 昇順必須 |
| -2 | バイナリ(降順) | 高速バイナリ検索。大量データ向け | 降順必須 |
⑥ MATCHからの置き換え早見表
| やりたいこと | MATCH(旧) | XMATCH(新) |
| 完全一致で位置を取得 | =MATCH(値, 範囲, 0) |
=XMATCH(値, 範囲) |
| 以下の最大値の位置 | =MATCH(値, 範囲, 1)※昇順ソート必須 |
=XMATCH(値, 範囲, -1)※ソート不要 |
| 以上の最小値の位置 | =MATCH(値, 範囲, -1)※降順ソート必須 |
=XMATCH(値, 範囲, 1)※ソート不要 |
| ワイルドカード検索 | =MATCH("A*", 範囲, 0) |
=XMATCH("A*", 範囲, 2) |
| 最後の一致を取得 | 裏技が必要(LOOKUP関数等) | =XMATCH(値, 範囲, 0, -1) |
| 大規模データの高速検索 | 不可 | =XMATCH(値, 範囲, 0, 2) |
⑦ 実践:INDEX + XMATCH(MATCH の完全代替)
| A | B | C | D | |
| 1 | 商品ID | 商品名 | 単価 | 在庫 |
| 2 | P-101 | ノートPC | 89,000 | 25 |
| 3 | P-205 | モニター | 34,000 | 42 |
| 4 | P-312 | キーボード | 8,500 | 150 |
| 5 | P-408 | マウス | 3,200 | 200 |
| 6 | P-510 | USBハブ | 2,400 | 80 |
「P-312」の単価を取得したい場合:
← , 0 を忘れると事故
← 引数の省略が安全。結果: 8,500
📐 2次元検索:INDEX + XMATCH × 2(XLOOKUPにはできない技)
行と列の両方を動的に決めたい場合、INDEX の行引数・列引数の両方にXMATCHを入れることで実現できます。
| A | B | C | D | |
| 1 | Q1 | Q2 | Q3 | |
| 2 | 東京 | 150 | 200 | 180 |
| 3 | 大阪 | 120 | 160 | 140 |
| 4 | 名古屋 | 90 | 110 | 100 |
→ 行は「大阪」=2行目、列は「Q3」=3列目 → 結果: 140
XLOOKUPは1方向の検索しかできないため、この「行も列も動的に決める」パターンでは INDEX + XMATCH の組み合わせが唯一の選択肢です。
・1方向の検索 → 値の取得:XLOOKUP 1本でOK(最もシンプル)
・位置(番号)だけが欲しい:XMATCH 単体
・行×列の2次元検索:INDEX + XMATCH × 2(XLOOKUP では不可)
⑧ 結論:XMATCHに乗り換えるべきか?
MATCHを使い続ける理由は「旧バージョンとの互換性」以外にありません。XMATCHはMATCHの完全上位互換であり、デフォルトが完全一致に変わったことで事故リスクが激減し、逆方向検索・バイナリ検索・ワイルドカード専用モード・正規表現と、できることも大幅に増えています。
唯一の注意点は、近似値検索の番号体系が逆転していること。MATCHの数式をXMATCHに機械的に置き換える際は、第3引数の
1 と -1 を入れ替えてください。