XMATCH:MATCHの完全上位互換。完全一致がデフォルトになり「0」の書き忘れから解放

💡 やりたいこと

リストの中から特定の値を探し、それが「上から(または左から)何番目にあるか」の相対的な位置(数値)を安全・確実に取得したい。

新関数での解決法:XMATCH

XLOOKUPの「検索機能のみ」を抜き出し、位置(行番号や列番号)を返す関数です。MATCH関数が抱えていた最大のトラップ「第3引数(0) の指定忘れ問題」を解決しました。

=XMATCH(検索値, 検索配列, [一致モード], [検索モード])
=XMATCH("当月売上", A1:Z1)

意味:1行目の中から「当月売上」という文字を探し、左から何番目にあるか(列番号)を返す。
これだけで「完全一致検索」になります。

🔥 旧MATCHでの悲劇(第3引数を忘れた場合)
旧来の =MATCH("売上", A1:Z1) は、第3引数である [照合の種類] を省略すると「1(近似値、昇順ソート必須)」という謎の挙動がデフォルトになっていました。初心者が 0(完全一致)を指定し忘れた結果、「見つからないのになぜか隣の列の番号が返ってきて、後続のINDEX関数で全く違う数値を取得し、誤ったレポートが作成される」という大事故が世界中の実務で多発していました。

XMATCHでは、XLOOKUP同様「省略すると完全一致」という安全な仕様に修正されたため、このトラップを踏むことが物理的になくなりました。

後ろからの検索とバイナリ検索

XLOOKUPと同様に、検索モード-1 を指定すれば「末尾から先頭への検索(最後の履歴を取得する際に行番号を拾う)」、2 を指定すれば「バイナリ検索」が使えます。

旧バージョンでの代替法(MATCH)

=MATCH("当月売上", A1:Z1, 0)
⚠️ 最後の , 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

このデータで「中村」を検索してみます。

❌ MATCH ── 引数を省略した場合(事故パターン)
=MATCH("中村", A2:A7)

第3引数を省略 → デフォルト 1(近似値・昇順ソート前提)になる。
内部でバイナリ検索的なアルゴリズムが走り、「中村」以下で最も近い値として
→ 返り値は 5(=「佐藤」の位置)🔥
「中村」を探しているのに「佐藤」の位置が返る。後続の INDEX で佐藤の売上 500 を取得してしまい、レポートが破綻します。

✅ XMATCH ── 引数を省略した場合(安全設計)
=XMATCH("中村", A2:A7)

第3引数を省略 → デフォルト 0(完全一致)になる。
A2:A7 を先頭から順に走査し、A6 で「中村」を発見。
→ 返り値は 5(= A2 から数えて5番目 = 正しく「中村」の位置)✅

⚠️ 同じ「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にしかできないこと

🔄 逆方向検索(最後に一致した位置を取得)

たとえば「担当:田中」が複数行ある場合に、最後の田中の位置を取りたいケースです。

データテーブル
AB
1日付担当
24/1田中
34/2鈴木
44/3田中
54/4佐藤
64/5田中
74/6伊藤
=XMATCH("田中", B2:B7, 0, -1) → 結果: 5(末尾から検索し、B6の田中を発見)
=XMATCH("田中", B2:B7, 0, 1) → 結果: 1(先頭から検索し、B2の田中を発見)

MATCHでは「最後の一致」を取得するために LOOKUP(1,1/COUNTIF(...),...) のような裏技が必要でしたが、XMATCHなら第4引数に -1 を入れるだけで完了します。

⚡ バイナリ検索(大規模データの高速化)

数万行〜数十万行のデータで位置を検索する場合、通常の先頭からの線形検索では時間がかかります。データが昇順(または降順)にソートされている場合、バイナリ検索を使うことで劇的に速くなります。

=XMATCH(検索値, ソート済み配列, 0, 2) ← 昇順の場合
=XMATCH(検索値, ソート済み配列, 0, -2) ← 降順の場合
⚠️ バイナリ検索の注意
データが正しくソートされていない状態でバイナリ検索を使うと、エラーにならず間違った結果が返ります。必ずソート済みであることを確認してから使ってください。

🃏 ワイルドカード専用モード

MATCHでもワイルドカード(*, ?)は使えましたが、それは「完全一致モード(0)にした場合のみ」で、検索値にワイルドカード文字を含めるという暗黙のルールでした。XMATCHでは一致モード 2 を明示的に指定する専用モードとして独立しています。

=XMATCH("東京*", A1:A100, 2) → 「東京」で始まるセルの位置を返す
💡 MATCHとの挙動差に注意
MATCHでは =MATCH("東京*", A1:A100, 0) と書くと、完全一致モードなのにワイルドカードが動作するという「二重人格」状態でした。XMATCHでは完全一致(0)とワイルドカード(2)が明確に分離されたため、「* を文字として完全一致したい」場合もモード 0 で安全に処理できます。

🧩 正規表現マッチ(一部の対応環境のみ)

一致モード 3 を指定すると、検索値に正規表現(Regex)パターンを使える環境があります。Microsoft 365の更新チャネルやExcel 2024のビルドによって利用可否が分かれるため、実務では =XMATCH( 入力時のヘルプや実機で確認してください。ワイルドカードでは表現できない複雑なパターンマッチングが可能です。

=XMATCH("[A-Z]{3}\d{2,4}[A-Z]{2}", B1:B100, 3)

「大文字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 の完全代替)

データテーブル
ABCD
1商品ID商品名単価在庫
2P-101ノートPC89,00025
3P-205モニター34,00042
4P-312キーボード8,500150
5P-408マウス3,200200
6P-510USBハブ2,40080

「P-312」の単価を取得したい場合:

旧:INDEX + MATCH
=INDEX(C2:C6, MATCH("P-312", A2:A6, 0))

, 0 を忘れると事故

新:INDEX + XMATCH
=INDEX(C2:C6, XMATCH("P-312", A2:A6))

← 引数の省略が安全。結果: 8,500

📐 2次元検索:INDEX + XMATCH × 2(XLOOKUPにはできない技)

行と列の両方を動的に決めたい場合、INDEX の行引数・列引数の両方にXMATCHを入れることで実現できます。

データテーブル
ABCD
1Q1Q2Q3
2東京150200180
3大阪120160140
4名古屋90110100
=INDEX(B2:D4, XMATCH("大阪", A2:A4), XMATCH("Q3", B1:D1))

→ 行は「大阪」=2行目、列は「Q3」=3列目 → 結果: 140
XLOOKUPは1方向の検索しかできないため、この「行も列も動的に決める」パターンでは INDEX + XMATCH の組み合わせが唯一の選択肢です。

💡 XLOOKUPとの使い分けまとめ
・1方向の検索 → 値の取得:XLOOKUP 1本でOK(最もシンプル)
・位置(番号)だけが欲しい:XMATCH 単体
・行×列の2次元検索:INDEX + XMATCH × 2(XLOOKUP では不可)

⑧ 結論:XMATCHに乗り換えるべきか?

Excel 2021 / 2024 / Microsoft 365 などでXMATCHが使えるなら → 即乗り換え推奨。

MATCHを使い続ける理由は「旧バージョンとの互換性」以外にありません。XMATCHはMATCHの完全上位互換であり、デフォルトが完全一致に変わったことで事故リスクが激減し、逆方向検索・バイナリ検索・ワイルドカード専用モード・正規表現と、できることも大幅に増えています。

唯一の注意点は、近似値検索の番号体系が逆転していること。MATCHの数式をXMATCHに機械的に置き換える際は、第3引数の 1-1 を入れ替えてください。

🔗 関連記事