スプレッドシートで MATCH関数 を使っていて、「末尾から検索できたらラクなのに」と思ったことはありませんか?日報や作業ログのように下へ追記していく台帳で、同じ担当者名が並んでいると、最新(最後)のエントリだけ拾いたいのに先頭側がヒットしてしまいますよね。
そんなときに頼りになるのが XMATCH関数 です。MATCH関数の上位互換にあたる検索系関数で、逆方向検索・ワイルドカード専用モード・並べ替え不要の近似一致・バイナリサーチ・正規表現まで、MATCHにはない機能が一通り揃っています。
この記事では、XMATCH関数の構文と引数の基本から、一致モード4種・検索モード4種の早見表、実務シーン別の応用例(最新ロット取得・INDEX+XMATCHで左方向検索・行列クロス検索・IFERRORでエラー回避)、MATCH関数との比較表、よくあるエラーの対処法までまとめて解説します。MATCH関数からの乗り換えを検討している方はもちろん、INDEX+MATCHの式に慣れている方ほど効果を実感しやすい関数ですよ。
スプレッドシートのXMATCH関数とは?MATCHの上位互換にあたる位置検索関数
XMATCH関数(読み方: エックスマッチ関数)は、検索範囲から指定した値を探し、その値が何番目にあるかを数値で返す関数です。関数名の「X」はExtended(拡張)の意味で、MATCH関数 を強化した上位互換にあたります。位置番号を返す点はMATCHと同じですが、検索の方向や一致の仕方を細かく指定できるのが特徴です。
たとえば部署列(C2:C6)から「総務部」が何番目にあるかを調べると、=XMATCH("総務部", C2:C6) で「3」が返ります。返るのは値そのものではなく、あくまで位置(インデックス)です。
XMATCH関数で何ができる?
XMATCH関数が活躍するのは、おもに次のような場面です。
- 検索値が範囲の 何番目にあるか を数値で取得したい(INDEX関数と組み合わせる前提のケース)
- 日報・作業ログなどの追記型データから 最新のエントリ位置 だけを拾いたい
- 検索列が範囲の左端にない表で、VLOOKUP関数 では届かない 左方向の検索 をしたい
- 大きな表で 行と列の見出しを同時に検索 して、クロス検索を組みたい
- 「ぴったり85点はないけれど80点台のランクは何位か」のような 近似一致 を、並べ替えなしで実現したい
NOTE
XMATCH関数が返すのは「位置番号」であって値そのものではありません。値を直接取得したい場合は、INDEX関数 や XLOOKUP関数 と組み合わせて使います。XMATCH関数は「位置」を返す部品として、INDEX関数との組み合わせで真価を発揮します。
XMATCH関数とMATCH関数の違い(ざっくり)
詳しい比較は後半の「XMATCH関数とMATCH関数の違い・使い分け」で解説しますが、ざっくり押さえておきたい違いは次の3点です。
- デフォルトが完全一致(MATCHは近似一致)なので、引数の指定ミスが起きにくい
- 逆方向検索(末尾から検索)が可能 で、追記型の台帳と相性がよい
- 近似一致でデータの並べ替えが不要 になり、事前のソート作業が要らない
XMATCH関数の構文と引数
基本構文
XMATCH関数の構文はこちらです。
=XMATCH(検索値, 検索範囲, [一致モード], [検索モード])
引数は4つあります。第3引数(一致モード)と第4引数(検索モード)は省略可能で、省略時はそれぞれ「完全一致」「先頭から検索」になります。
引数の説明
| 引数 | 必須/省略可 | 説明 | 指定例 |
|---|---|---|---|
| 検索値 | 必須 | 探したい値(文字列・数値・セル参照) | “営業部”、E001、A1 |
| 検索範囲 | 必須 | 検索対象の 1行または1列 の範囲 | A2:A6、B1:F1 |
| 一致モード | 省略可 | 一致の判定方法(0, -1, 1, 2, 3) | 0 |
| 検索モード | 省略可 | 検索する方向(1, -1, 2, -2) | 1 |
省略した場合は「先頭から完全一致で検索」という最もシンプルな動作になります。MATCH関数とは異なりデフォルトが完全一致なので、第3引数の書き忘れによる事故が起きにくいのがメリットです。
TIP
検索範囲には 1行または1列 だけを指定します。
A1:C5のような2次元の範囲を渡すと#VALUE!エラーになります。複数列を横断して検索したい場合は、後述の「INDEX+XMATCHでクロス検索する」パターンを使いましょう。
一致モード5種の早見表
一致モードは、検索値と範囲内の値をどう照合するかを決める引数です。
| 一致モード | 動作 | データの並び順 | 主な用途 |
|---|---|---|---|
| 0(デフォルト) | 完全一致。値がぴったり一致する位置を返す | 不問 | 通常の検索 |
| -1 | 検索値以下の最大値 の位置を返す | 不問 | 価格帯・点数のランク判定 |
| 1 | 検索値以上の最小値 の位置を返す | 不問 | 在庫の繰上げ判定 |
| 2 | ワイルドカード一致(*、?、~ を使用) | 不問 | 部分一致検索 |
| 3 | 正規表現一致(スプレッドシート独自) | 不問 | 複雑なパターン照合 |
MATCH関数の近似一致ではデータの並べ替えが必須でしたが、XMATCHなら並べ替え不要で近似一致ができます。一致モード3の正規表現は Googleスプレッドシート独自の拡張 で、Excelには無い機能です。
検索モード4種の早見表
検索モードは、範囲をどの方向から探すかを決める引数です。
| 検索モード | 動作 | 条件 | 主な用途 |
|---|---|---|---|
| 1(デフォルト) | 先頭から検索 | 不問 | 通常の検索 |
| -1 | 末尾から逆方向検索 | 不問 | 最新エントリの取得 |
| 2 | 昇順バイナリサーチ | 昇順にソート済み必須 | 大量データの高速検索 |
| -2 | 降順バイナリサーチ | 降順にソート済み必須 | 大量データの高速検索 |
通常は先頭から検索(1)で問題ありません。末尾から検索(-1)はXMATCH関数の目玉機能で、MATCH関数にはない便利な動作です。
XMATCH関数の基本的な使い方
ここからは具体例で動きを見ていきます。以下の社員管理表(A1:D6)を使って説明します。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 社員番号 | 氏名 | 部署 | 役職 |
| 2 | E001 | 田中太郎 | 営業部 | 課長 |
| 3 | E002 | 鈴木花子 | 経理部 | 主任 |
| 4 | E003 | 佐藤一郎 | 総務部 | 部長 |
| 5 | E004 | 山田美咲 | 営業部 | 主任 |
| 6 | E005 | 高橋健一 | 開発部 | 課長 |
完全一致で位置を取得する(一致モード 0)
部署列(C2:C6)の中で「総務部」が何番目にあるかを調べる、いちばんシンプルな使い方です。
=XMATCH("総務部", C2:C6)
結果は「3」になります。C2:C6 の中で「総務部」は C4 にあり、先頭から数えて3番目の位置だからです。
一致モードを省略しても完全一致で検索してくれます。MATCH関数では =MATCH("総務部", C2:C6, 0) のように第3引数に 0 を書く必要がありましたが、XMATCHなら省略できる分シンプルです。
ワイルドカードで部分一致検索する(一致モード 2)
部分一致で検索したいときは、一致モードに 2 を指定します。*(任意の文字列)と ?(任意の1文字)が使えます。
| ワイルドカード | 意味 | 使用例 |
|---|---|---|
*(アスタリスク) | 任意の文字列(0文字以上) | "*太郎" → 太郎で終わる値 |
?(クエスチョン) | 任意の1文字 | "E00?" → E001〜E009 |
~(チルダ) | * や ? 自体をエスケープ | "~" → を検索 |
たとえば氏名列から「鈴木」で始まる人の位置を調べるには、こう書きます。
=XMATCH("鈴木*", B2:B6, 2)
結果は「2」です。B2:B6 の中で「鈴木花子」が2番目にあるため、その位置が返ります。
NOTE
MATCH関数では完全一致モード(0)でワイルドカードが使えましたが、XMATCHではワイルドカード専用の一致モード(2)に分離されています。完全一致モード(0)のままだと
や?は ただの文字 として扱われるので、"鈴木"を検索しても #N/A になります。
近似一致で最も近い値を取得する(一致モード -1 / 1)
数値データに対して「ぴったり一致する値がなければ、近い値で代用する」モードです。
- -1(以下の最大値): 検索値以下で最も大きい値の位置を返す
- 1(以上の最小値): 検索値以上で最も小さい値の位置を返す
たとえば、点数テーブル {60, 70, 80, 90} に対して85点のランクを調べたいとします。テーブルに85はありませんが、以下のように書けば80の位置が返ります。
=XMATCH(85, {60,70,80,90}, -1)
この式は「3」を返します。85以下の最大値は80で、テーブルの3番目だからです。逆に「85以上で最も小さい値」を取りたい場合は =XMATCH(85, {60,70,80,90}, 1) と書くと、90の位置である「4」が返ります。
MATCH関数の近似一致ではデータの昇順・降順ソートが必須でしたが、XMATCHなら 並べ替え不要 で近似一致ができます。価格帯テーブルや評価テーブルのように、後から行を追加することがある表で特に便利です。
正規表現で柔軟に一致させる(一致モード 3・スプレッドシート独自)
Googleスプレッドシート版のXMATCH関数には、Excelには無い 正規表現一致モード(3) があります。* や ? よりも複雑なパターンを書きたいときに使います。
=XMATCH("E00[1-3]", A2:A6, 3)
E001〜E003 のいずれかにマッチする最初の位置を返します。上記の例では A2 の「E001」が最初に該当するので「1」が返ります。[1-3] は文字クラスで、1 か 2 か 3 のいずれか1文字を表します。
正規表現を使うと「3桁の数字で終わる商品コード」「特定の接頭辞+数字」のような 構造的な検索 が一発で書けます。ただし正規表現に慣れていないと読みにくくなりがちなので、シンプルな部分一致ならワイルドカード(一致モード2)で十分です。
XMATCH関数の実践的な使い方・応用例
逆方向検索で最新データの位置を取得する
XMATCH関数の目玉機能が、逆方向検索(検索モード -1) です。末尾から先頭に向かって検索し、最初に見つかった位置を返します。
これが活躍するのは、日報や作業ログのような 追記型の台帳 です。下へどんどん行を追加していくシートで、同じ担当者名が何度も登場するとき、「最新(最後)のエントリだけ拾いたい」というニーズに刺さります。
=XMATCH("田中太郎", B2:B100, 0, -1)
第3引数の 0 は完全一致、第4引数の -1 が末尾からの逆方向検索です。MATCH関数では逆順検索ができなかったので、MAX と IF の配列数式を組み合わせるような回りくどい式が必要でした。XMATCHなら検索モードに -1 を渡すだけで解決します。
TIP
逆方向検索でも返る値は 「先頭からの位置番号」 です。たとえば B2:B100 の80番目に該当データがあれば、検索方向に関係なく「80」が返ります。INDEX関数に渡せばそのまま該当行の値を取り出せるので、計算ロジックを変える必要はありません。
INDEX+XMATCHで左方向の列を検索する
XMATCH関数が最も活躍するのは、INDEX関数 と組み合わせる INDEX+XMATCH のパターンです。
VLOOKUP関数 は検索列が範囲の 左端 にある必要があり、左方向の検索ができません。一方、INDEX+XMATCHなら、検索列と戻り値の列を別々に指定できるので、左方向の検索も問題なく書けます。
たとえば「営業部の社員の社員番号を知りたい」とします。部署(C列)で検索して、社員番号(A列)を返す数式です。
=INDEX(A2:A6, XMATCH("営業部", C2:C6))
処理の流れは次のとおりです。
XMATCH("営業部", C2:C6)→ C2:C6 で「営業部」は1番目 → 「1」を返すINDEX(A2:A6, 1)→ A2:A6 の1番目 → 「E001」を返す
検索範囲(C列)と戻り値の範囲(A列)を別々に指定できるため、左方向だけでなく 離れた列同士 の参照も自由自在です。
INDEX+XMATCHで行列クロス検索する
INDEX+XMATCH最大の見せ場が、行と列を同時に検索するクロス検索 です。行の位置も列の位置もXMATCHで動的に取得することで、表のどこを参照するかを完全に数式で組み立てられます。
「社員番号 E003 の役職を取得したい」というケースで見てみましょう。
=INDEX(A2:D6, XMATCH("E003", A2:A6), XMATCH("役職", A1:D1))
処理の流れはこうなります。
XMATCH("E003", A2:A6)→ 「3」(A列で3番目)XMATCH("役職", A1:D1)→ 「4」(見出し行で4番目)INDEX(A2:D6, 3, 4)→ 表の3行4列目 → 「部長」を返す
列の見出し名で位置を検索するので、途中に列が追加・移動されても数式が壊れません。大きな表や、列構成が変わる可能性があるテンプレートで特に重宝するパターンです。
IFERRORと組み合わせてエラーを防ぐ
XMATCH関数は検索値が見つからないと #N/A エラーを返します。共有シートで他の人にも触らせる表では、IFERROR関数 で囲んでエラー表示を避けるのが定番です。
=IFERROR(XMATCH("マーケ部", C2:C6), "該当なし")
「マーケ部」はデータに存在しないため、#N/A ではなく「該当なし」が表示されます。
INDEX+XMATCH の式と組み合わせる場合は、全体をIFERRORで囲む のがポイントです。
=IFERROR(INDEX(B2:B6, XMATCH("E010", A2:A6)), "見つかりません")
XMATCH側にだけIFERRORを掛けると、INDEX関数に「該当なし」が渡されて別のエラーになります。エラーの起点となる関数ではなく、最終的な数式全体をIFERRORで包みましょう。
バイナリサーチで大量データを高速検索する
データが数万行を超えていて、かつ すでに昇順または降順にソート済み の場合は、バイナリサーチ(検索モード 2 または -2)が使えます。
=XMATCH("E003", A2:A10000, 0, 2)
二分探索のアルゴリズムで検索するので、線形検索よりも処理が高速です。ただし データが正しくソートされていないと誤った結果を返す ので注意が必要です。
NOTE
数万行レベルでも体感差が出にくいケースが多いです。バイナリサーチは「ソート済みであることを保証できる」「再計算回数が多い」など、明確に高速化を必要とする場面で導入を検討しましょう。並べ替えコストとのトレードオフも忘れずに。
実務シナリオ: 在庫表で最新ロットの位置を取得する
応用パターンとして、入出庫履歴から特定の商品の 最新ロット行 を取り出すケースを見てみましょう。A列に商品コード、B列にロット番号、C列に入庫日が並んでいる入庫履歴を想定します。
=INDEX(B2:B500, XMATCH("APPLE-01", A2:A500, 0, -1))
XMATCH("APPLE-01", A2:A500, 0, -1) で「APPLE-01」の 末尾側の出現位置 を取得し、その位置のロット番号を INDEX で取り出しています。逆方向検索(-1)を使うことで、最後に入庫されたロット番号だけを拾えます。
「最新の単価」「最終更新日」など、追記型データから最新値を取り出す処理は実務で頻出です。INDEX+XMATCH+逆方向検索の3点セットは覚えておくと応用が利きます。
XMATCH関数のよくあるエラーと対処法
XMATCH関数で発生しやすいエラーと、その原因・対処法を早見表にまとめます。
| エラー | 主な原因 | 対処法 |
|---|---|---|
| #N/A | 検索値が範囲内に存在しない | データの有無を確認する。IFERRORで囲む |
| #N/A | データ型の不一致(数値と文字列の混在) | 検索値と範囲のデータ型を揃える |
| #N/A | ワイルドカードを一致モード0で使っている | 一致モードを2に変更する |
| #VALUE! | 検索範囲に2次元の範囲を指定(例: A1:C5) | 1行または1列の範囲に変更する |
| #VALUE! | 一致モードや検索モードに無効な値を指定 | 0, -1, 1, 2, 3(一致モード)/ 1, -1, 2, -2(検索モード) |
| 期待と違う結果 | 全角/半角・大文字小文字の不一致 | ASC関数・UPPER関数などで事前に正規化 |
#N/Aエラー(検索値が見つからない)の対処法
XMATCH関数でいちばん多いエラーです。データ自体が存在しない場合と、型の不一致 で見つからない場合の2パターンがあります。
セルの見た目は同じ数字でも、片方が数値・もう片方が文字列だと別物と判定されます。確認するには、対象セルを選択して数式バーの表示をチェックしてください。文字列として入力された数字はセル内で 左寄せ で表示されます(数値は右寄せ)。VALUE関数で文字列を数値に変換すれば、型を揃えられます。
=XMATCH(VALUE(A2), B2:B100, 0)
逆に範囲側が数値で検索値が文字列なら、検索値を VALUE("123") のように変換します。どちらに揃えるかはデータの実体に合わせて選びましょう。
#VALUE!エラー(範囲指定が不正)の対処法
検索範囲に2次元の範囲(A1:C5など)を指定すると発生します。XMATCH関数は 1行または1列のみ を受け付けます。
=XMATCH("総務部", C2:D6)
このように2列を渡すと #VALUE! になります。複数列を横断して検索したい場合は、前述の「INDEX+XMATCHで行列クロス検索する」のように、行用と列用の2つのXMATCHに分けてください。
大文字小文字・全角半角の表記ゆれ対策
XMATCH関数の値の照合は 大文字と小文字を区別しません(”ABC” と “abc” は同じ)。一方で 全角と半角は別物 として扱います(”E001″ と “E001” は別)。
データに全角の英数字や記号が紛れ込んでいる場合は、事前に ASC関数で半角に統一しておくと安心です。
=XMATCH(ASC(A2), ARRAYFORMULA(ASC(C2:C100)), 0)
検索値と範囲の両方を ASC で半角化することで、表記ゆれを吸収できます。範囲側に ARRAYFORMULA を使うのは、関数を範囲全体に適用するためです。
XMATCH関数とMATCH関数の違い・使い分け
XMATCHはMATCH関数の上位互換です。主な違いを比較表で整理します。
| 比較項目 | MATCH | XMATCH |
|---|---|---|
| デフォルトの一致モード | 近似一致(1) | 完全一致(0) |
| 近似一致の並べ替え | 昇順/降順が必須 | 不要 |
| 逆方向検索(末尾から検索) | 不可 | 可能(検索モード -1) |
| ワイルドカード | 完全一致モード(0)で使用 | 専用モード(2)で使用 |
| バイナリサーチ | 不可 | 可能(検索モード 2 / -2) |
| 正規表現 | 不可 | 一致モード 3(スプレッドシート独自) |
| 引数の数 | 3つ(検索値・範囲・一致モード) | 4つ(検索値・範囲・一致モード・検索モード) |
MATCH→XMATCHへの書き換え(Before/After)
実務でよく使う完全一致のパターンを、書き換え例で見てみましょう。
Before(MATCH関数):
=MATCH("総務部", C2:C6, 0)
After(XMATCH関数):
=XMATCH("総務部", C2:C6)
第3引数の 0 を省略できる分、XMATCHのほうがシンプルです。完全一致がデフォルトなので、書き忘れによるエラーの心配もありません。
どちらを選ぶべき?シーン別の判断基準
判断基準はシンプルに次のとおりです。
- 新しく数式を作る場合 → XMATCH関数がおすすめ。デフォルト完全一致で安全
- 既存シートを部分修正する場合 → 既存のMATCH関数に合わせて統一感を優先
- 末尾側の一致を取得したい場合 → XMATCH関数の逆方向検索(-1)一択
- 大量データを高速検索したい場合 → XMATCH関数のバイナリサーチ(2/-2)
- 正規表現で複雑なパターンを検索したい場合 → XMATCH関数の一致モード3
XMATCH関数とXLOOKUP関数の使い分け
「値そのものを取得したいだけ」なら、XLOOKUP関数 のほうがシンプルに書けます。
=XLOOKUP("E003", A2:A6, D2:D6)
XLOOKUPは検索範囲と戻り値範囲を直接指定するので、INDEX+XMATCHの2段構えが不要です。一方で 位置番号自体が必要 なケース(行番号を別の計算に流したい・複数列を一度に取りたい・行列クロス検索したいなど)では、XMATCH関数のほうが柔軟性で勝ります。
| やりたいこと | おすすめ関数 |
|---|---|
| 1列のテーブルから値を取り出すだけ | XLOOKUP関数 |
| 位置番号を別の計算に使いたい | XMATCH関数 |
| 行と列の見出しから値を取り出したい(クロス検索) | INDEX + XMATCH |
| 検索列の左側の値を取り出したい | XLOOKUP関数 または INDEX + XMATCH |
| 検索値が末尾側のものを取得したい | XMATCH関数(検索モード -1) |
INDEX+MATCHとの違い
長年の定番である INDEX+MATCH の式も、INDEX+XMATCH に置き換えるだけで動きます。
Before(INDEX+MATCH):
=INDEX(A2:A6, MATCH("営業部", C2:C6, 0))
After(INDEX+XMATCH):
=INDEX(A2:A6, XMATCH("営業部", C2:C6))
XMATCH側で 0 を省略できるだけで、ほぼ同じ感覚で使えます。逆方向検索や正規表現が必要になったとき、XMATCHのほうが拡張余地が大きいのが強みです。
まとめ:XMATCH関数で位置検索を一段ラクにする
最後にXMATCH関数のポイントを振り返ります。
- 構文は
=XMATCH(検索値, 検索範囲, [一致モード], [検索モード])の4引数で、第3・第4引数は省略可 - デフォルトが完全一致 なので、引数の指定ミスが起きにくい
- 逆方向検索(検索モード -1) で、追記型の台帳から最新エントリの位置を一発取得できる
- 近似一致で並べ替え不要 になり、価格帯や評価テーブルの参照が手軽に
- ワイルドカードは 専用の一致モード(2) で使う。完全一致モード(0)では文字として扱われる
- スプレッドシート版には 正規表現の一致モード(3) もあり、複雑なパターンも検索できる
- INDEX関数 と組み合わせれば、左方向の検索・行列クロス検索 が自由自在
まずは =XMATCH("検索値", 範囲) の完全一致パターンから試してみてください。MATCH関数を使っている方は、XMATCHに切り替えるだけで検索の自由度がぐっと広がりますよ。INDEX+MATCH派の方は、MATCH を XMATCH に置き換えるところから始めるのがおすすめです。
