概要
「この表、列の順番がよく変わるんだけど、“見出し名”で目的の列を取りたい」
「‘売上’という列が何列目かを、自動で数式に反映したい」
こういうときに使えるのが XMATCH(エックスマッチ)関数です。
XMATCH は、
「検索値が、範囲の中で何番目にあるか」を返す関数 で、
特に「1行目の見出し行から、見出し名で列番号を取得する」用途と相性抜群です。
VLOOKUP で列番号を手入力していた世界から卒業できる関数、とイメージしてください。
XMATCH の基本
書式と意味
=XMATCH(検索値, 検索範囲, [一致モード], [検索モード])
よく使うのは、前半の2つ+一致モードです。
検索値
探したい値。ここでは「見出し名(例:売上、単価)」を指定します。
検索範囲
どこから探すか。見出し行(1行目)の範囲を指定します。
例:$A$1:$Z$1
一致モード(省略可)
0 を指定すると「完全一致」です。
省略すると 0(完全一致)とほぼ同じ動きと思ってOKです。
見出し名から「何列目か」を取得する基本パターン
1行目の見出し名から列位置を求める
1行目に見出しがある表を考えます。
A1:商品コード
B1:商品名
C1:単価
D1:数量
E1:売上
このとき、「売上」が何列目かを求める式はこうなります。
=XMATCH("売上", $A$1:$E$1, 0)
結果は 5(A列から数えて5番目)です。
見出し名をセルに持たせたいなら、たとえば G1 に「売上」と入力しておいて:
=XMATCH(G1, $A$1:$E$1, 0)
としても同じです。
XMATCH × INDEX で「見出し名で列を指定して値を取る」
XMATCH だけだと「何番目か」までですが、
INDEX と組み合わせると「その列の値」を取ってこられます。
行番号+XMATCH で「見出し名で列指定」の INDEX
さきほどの表で、
行方向:何行目か(例:5行目)
列方向:見出し名(例:売上)
で値を取りたいとします。
=INDEX($A$2:$E$100,
行番号,
XMATCH("売上", $A$1:$E$1, 0))
例えば、F2 に「行番号」、G1 に「見出し名」が入っているなら:
=INDEX($A$2:$E$100,
F2,
XMATCH(G1, $A$1:$E$1, 0))
こう書くと、
- 行は F2 の数字
- 列は G1 の見出し名
で、柔軟に値を取り出せるようになります。
「列の順番が変わっても、見出し名さえ同じなら壊れない」構造になります。
XLOOKUP と組み合わせて「横方向のマスタ参照」に使う
XMATCH は「横方向の位置」を求めるのが得意なので、
横方向に見出しが並んだマスタから、
任意の見出しの列を XLOOKUP で取りたいときにも使えます。
例:列名をセルで選んで、その列を XLOOKUP で引く
A1:商品コード
B1:商品名
C1:単価
D1:在庫
A2:D100 に商品マスタがあり、
E2 に商品コード、
F1 に「取得したい列名」(例:単価)を入れておくとします。
F2 に「F1 で指定した列の値」を表示したい場合:
=INDEX($A$2:$D$100,
XMATCH(E2, $A$2:$A$100, 0),
XMATCH(F1, $A$1:$D$1, 0))
ここでは行方向にも XMATCH を使っていますが、
ポイントは「列側(第3引数)に XMATCH(F1, 見出し行) を入れている」ことです。
「どの列を取るか」を文字列で動的に変えたいときに使えるパターンです。
列挿入に強い数式を作る
XMATCH の大きなメリットは、
列の順番や挿入に強くなる ことです。
例えば、VLOOKUP だと:
=VLOOKUP(検索値, 範囲, 3, FALSE)
のように「3」という固定列番号を書きますが、
列を挿入すると「3列目」が意味する列が変わって、結果がズレたりします。
XMATCH+INDEX で見出し名にしておけば、
=INDEX(範囲,
行番号,
XMATCH("売上", 見出し行, 0))
「売上」という見出しを追いかけてくれるので、
列の並び替え・挿入に強い式になります。
よくあるつまずきと対策
見出し行の範囲がズレている
悪い例:
=XMATCH("売上", $B$1:$E$1, 0)
実際の見出しは A1:E1 なのに、B1からにしてしまうと、
「列番号」が1つずれた値になります。
INDEX などと組み合わせるときは、
必ず「表全体の1列目」を含めた範囲で XMATCH をかける
ように意識してください。
同じ見出し名が複数あると「最初の1つ」だけ
XMATCH は、上から(左から)検索して最初に見つかった位置を返します。
同じ見出し名が複数ある場合は「最初の1つ」だけが対象になります。
見出し名は基本「一意(かぶらない)」に設計しておくのがベストです。
似た名前・全角半角・スペースに注意
「売上」と「売上 」のように、末尾スペースや全角半角の違いがあると一致しません。
思った位置が返らないときは、見出しセルの内容をよく確認してください。
例題
問題1: A1:E1 に「商品コード, 商品名, 単価, 数量, 売上」の見出しがあります。「売上」が何列目かを求める式を G1 に書いてください。
=XMATCH("売上", $A$1:$E$1, 0)
問題2: G1 に見出し名(例:「数量」)が入っています。G1 に入力された見出しが A1:E1 の何列目かを求める式を G2 に書いてください。
=XMATCH(G1, $A$1:$E$1, 0)
問題3: A1:E1 に見出し、A2:E100 にデータがあります。H1 に見出し名、H2 に「行番号」が入っているとき、「H1 で指定した列」の「H2 行目の値」を I2 に表示する INDEX+XMATCH の式を書いてください。
=INDEX($A$2:$E$100,
H2,
XMATCH(H1, $A$1:$E$1, 0))
問題4: A1:D1 に「商品コード, 商品名, 単価, 在庫」の見出し、A2:D100 に商品マスタがあります。E2 に商品コード、F1 に「取得したい見出し名(例:単価)」が入っているとき、F2 にその値を表示する式を書いてください。
=INDEX($A$2:$D$100,
XMATCH(E2, $A$2:$A$100, 0),
XMATCH(F1, $A$1:$D$1, 0))
問題5: A1:E1 に見出し、A2:E100 にデータがあります。見出し名を「売上」で固定し、行番号だけを F2 に入力して、その行の「売上」列の値を G2 に表示する式を書いてください。
=INDEX($A$2:$E$100,
F2,
XMATCH("売上", $A$1:$E$1, 0))
まとめ
XMATCH は、
- 「見出し名が何列目か」を数値で返してくれる
- INDEX などと組み合わせると「見出し名で列を指定」できる
- 列の挿入・並べ替えに強い数式が作れる
という、“見出しに強い MATCH の進化版”です。
型としては次の2つを押さえておくと便利です。
=XMATCH(見出し名, 見出し行, 0)
=INDEX(データ範囲, 行番号, XMATCH(見出し名, 見出し行, 0))
この2つが自然に書けるようになると、
「列番号を手で数える」「列追加で式が壊れる」という悩みから解放されます。
