スプレッドシートのXMATCH関数の使い方|MATCHとの違い・逆方向検索まで解説

スポンサーリンク

スプレッドシートでMATCH関数を使っていて、「末尾から検索できたらいいのに」と感じたことはありませんか?

追記型のリストで同じ名前が並んでいると、最新のデータだけ拾いたいのに先頭側がヒットしてしまいますよね。

そこで活躍するのがXMATCH関数です。逆方向検索やワイルドカード専用モードなど、MATCHにはない機能が揃っています。

この記事では、XMATCH関数の基本から実務活用まで解説します。

スプレッドシートのXMATCH関数とは?

XMATCH関数(読み方: エックスマッチ関数)は、検索範囲から指定した値を探し、その位置(何番目か)を数値で返す関数です。「X」はExtended(拡張)の意味で、MATCH関数を強化した上位互換にあたります。

XMATCH関数にできることをまとめると、次のとおりです。

  • 検索値が範囲の何番目にあるかを数値で返す
  • 完全一致・近似一致・ワイルドカード・正規表現の4種類の一致モードに対応する
  • 先頭から/末尾からの検索方向を選べる(逆方向検索)
  • INDEX関数と組み合わせて柔軟な表引きを実現する

NOTE

XMATCH関数が返すのは値そのものではなく「位置番号」です。値を直接取得したい場合は、INDEX関数やXLOOKUP関数と組み合わせて使います。

XMATCH関数の書き方(構文と引数)

基本構文

XMATCH関数の構文はこちらです。

=XMATCH(検索値, 検索範囲, [一致モード], [検索モード])

引数は4つあります。一致モードと検索モードは省略できます。

引数の説明

引数必須/省略可意味指定例
検索値必須探したい値“営業部”、E001
検索範囲必須検索対象の1行または1列の範囲A2:A6
一致モード省略可一致の判定方法(0, -1, 1, 2)0
検索モード省略可検索する方向(1, -1, 2, -2)1

省略した場合は「先頭から完全一致で検索」という最もシンプルな動作になります。MATCH関数とは異なり、デフォルトが完全一致です。引数の指定ミスが起きにくいのがメリットです。

一致モード4種の違い

一致モードは検索値と範囲内の値をどう照合するかを決めます。

一致モード動作データの並び順
0(デフォルト)完全一致。値がぴったり一致する位置を返す不問
-1検索値以下の最大値の位置を返す不問
1検索値以上の最小値の位置を返す不問
2ワイルドカード一致(*、?、~)不問

MATCH関数の近似一致ではデータの並べ替えが必須でしたが、XMATCHなら並べ替え不要で近似一致ができます。

検索モード4種の違い

検索モードは範囲をどの方向から探すかを決めます。

検索モード動作条件
1(デフォルト)先頭から検索不問
-1末尾から逆方向検索不問
2昇順ソート済みデータでバイナリサーチ昇順必須
-2降順ソート済みデータでバイナリサーチ降順必須

通常は先頭から検索(1)で問題ありません。末尾から検索(-1)はXMATCH関数の目玉機能で、MATCH関数にはない機能です。

XMATCH関数の基本的な使い方

完全一致で位置を取得する(一致モード 0)

次の社員管理表を例に見てみましょう。A1:D6にデータが入っているとします。

 ABCD
1社員番号氏名部署役職
2E001田中太郎営業部課長
3E002鈴木花子経理部主任
4E003佐藤一郎総務部部長
5E004山田美咲営業部主任
6E005高橋健一開発部課長

部署列(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)ではワイルドカードは文字として扱われるので注意してください。

近似一致で最も近い値を取得する(一致モード -1 / 1)

数値データに対して「ぴったり一致する値がなければ、近い値で代用する」モードです。

  • -1(以下の最大値): 検索値以下で最も大きい値の位置を返す
  • 1(以上の最小値): 検索値以上で最も小さい値の位置を返す

たとえば、点数テーブルで85点のランクを調べたいとします。テーブルに85がなくても、以下のように書けます。80の位置を返してくれます。

=XMATCH(85, {60,70,80,90}, -1)

この式は「3」を返します。85以下の最大値は80で、3番目だからです。

MATCH関数の近似一致ではデータの昇順・降順ソートが必須でした。XMATCHなら並べ替え不要で近似一致ができます。

実践的な使い方・応用例

逆方向検索で最新データの位置を取得する

XMATCH関数の目玉機能が、逆方向検索(検索モード -1)です。末尾から先頭に向かって検索し、最初に見つかった位置を返します。

これが活躍するのは「追記型の台帳」です。日報や作業ログのように下へ追記していくシートを想像してください。同じ担当者名が複数行にあるとき、最新(最後)のエントリの位置を取得できます。

=XMATCH("田中太郎", B2:B100, 0, -1)

MATCH関数では逆順検索ができなかったため、回りくどい数式が必要でした。XMATCHなら検索モードに-1を指定するだけで解決です。

TIP

逆方向検索でも返る値は「先頭からの位置番号」です。たとえばB2:B100の80番目に該当データがあれば、検索方向に関係なく「80」が返ります。

INDEX+XMATCHで左側の列を検索する

XMATCH関数が最も活躍するのは、INDEX関数との組み合わせです。

VLOOKUP関数は検索列が範囲の左端にある必要があります。しかしINDEX+XMATCHなら、検索列と戻り値の列を自由に指定できます。

たとえば「営業部の課長の社員番号を知りたい」とします。部署(C列)で検索して、社員番号(A列)を返す数式です。

=INDEX(A2:A6, XMATCH("営業部", C2:C6))

処理の流れを順に見ていきます。

  1. XMATCH(“営業部”, C2:C6) → C2:C6の中で「営業部」は1番目 → 「1」を返す
  2. INDEX(A2:A6, 1) → A2:A6の1番目 → 「E001」を返す

検索範囲(C列)と戻り値の範囲(A列)を別々に指定できるため、左方向の検索も問題ありません。

INDEX+XMATCHでクロス検索する(行と列を同時に指定)

ちょっとむずかしく見えますが、やっていることはシンプルです。行と列の両方をXMATCHで動的に指定することで、クロス検索ができます。

「社員番号E003の役職を取得したい」とします。行の位置も列の位置もXMATCHで自動判定する数式です。

=INDEX(A2:D6, XMATCH("E003", A2:A6), XMATCH("役職", A1:D1))

処理の流れを見てみましょう。

  1. XMATCH(“E003”, A2:A6) → 「3」(3行目)
  2. XMATCH(“役職”, A1:D1) → 「4」(4列目)
  3. INDEX(A2:D6, 3, 4) → 「部長」を返す

列の見出し名で検索するため、途中に列が追加されても数式が壊れません。大きな表を扱うときに重宝するパターンです。

IFERRORと組み合わせてエラーを防ぐ

XMATCH関数は検索値が見つからないと#N/Aエラーを返します。IFERROR関数で囲めば、エラー表示を防げます。

=IFERROR(XMATCH("マーケ部", C2:C6), "該当なし")

「マーケ部」はデータに存在しないため、「該当なし」が表示されます。

INDEX+XMATCHと組み合わせる場合は、全体をIFERRORで囲みます。

=IFERROR(INDEX(B2:B6, XMATCH("E010", A2:A6)), "見つかりません")

共有シートなど他の人が使う表では、IFERRORを付けておくのがおすすめです。

バイナリサーチで大量データを高速検索する

データが大量(数万行以上)で、すでに並べ替え済みの場合は、バイナリサーチが使えます。

  • 検索モード 2: 昇順ソート済みデータに対して二分探索
  • 検索モード -2: 降順ソート済みデータに対して二分探索
=XMATCH("E003", A2:A10000, 0, 2)

通常の検索より高速ですが、データが正しくソートされていないと誤った結果を返します。少量データなら通常検索で十分です。無理に使う必要はありません。

よくあるエラーと対処法

XMATCH関数で発生しやすいエラーとその原因をまとめます。

エラー主な原因対処法
#N/A検索値が範囲内に存在しないデータの有無を確認する。IFERRORで囲む
#N/Aデータ型の不一致(数値と文字列の混在)検索値と範囲のデータ型を揃える
#N/Aワイルドカードを一致モード0で使っている一致モードを2に変更する
#VALUE!検索範囲に2次元の範囲を指定した(例: A1:C5)1行または1列の範囲に変更する
#VALUE!一致モードや検索モードに無効な値を指定した有効な値(0, -1, 1, 2)を確認する

特にありがちなのが、データ型の不一致です。セルの見た目は同じ数字でも、片方が数値・もう片方が文字列だと一致と判定されません。

確認するにはセルを選択して、数式バーの表示をチェックしてください。文字列として入力された数字は左寄せで表示されます。VALUE関数(文字列を数値に変換する関数)で型を揃えると解決します。

XMATCH関数とMATCH関数の違い・使い分け

XMATCHはMATCH関数の上位互換です。主な違いを比較表で整理します。

比較項目MATCHXMATCH
デフォルトの一致モード近似一致(1)完全一致(0)
近似一致の並べ替え昇順/降順が必須不要
逆方向検索(末尾から検索)不可可能(検索モード-1)
ワイルドカード完全一致モード(0)で使用可専用モード(2)で使用
バイナリサーチ不可可能(検索モード2/-2)
正規表現不可一致モード3で対応(スプレッドシート独自)

どちらを選ぶべき?

判断基準はシンプルです。

  • 新しく数式を作る場合 → XMATCHがおすすめ。デフォルト完全一致で安全
  • 既存のシートを修正する場合 → 既存のMATCHに合わせるのが無難
  • 末尾側の一致を取得したい場合 → XMATCHの逆方向検索を使う
  • 大量データを高速検索したい場合 → XMATCHのバイナリサーチを使う

なお、値そのものを取得したい場合はXLOOKUP関数のほうがシンプルに書けます。XMATCH関数は位置番号が必要なケースや、INDEX関数との組み合わせでクロス検索をしたいケースで特に威力を発揮します。

まとめ

XMATCH関数のポイントを振り返ります。

  • 構文は =XMATCH(検索値, 検索範囲, 一致モード, 検索モード) の4引数。第3・第4引数は省略可
  • デフォルトが完全一致なので、引数の指定ミスが起きにくい
  • 逆方向検索(検索モード-1)で最新データの位置を簡単に取得できる
  • 近似一致で並べ替え不要になり、手間が減った
  • ワイルドカード一致は専用モード(一致モード2)で使用する
  • INDEX関数と組み合わせれば、縦横同時のクロス検索が可能

まずは =XMATCH("検索値", 範囲) の完全一致パターンから試してみてください。MATCH関数を使っている方は、XMATCHに切り替えるだけで検索がグッと楽になりますよ。

関連記事

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