Excel関数 逆引き集 | 見出し名で列取得 → XMATCH

Excel VBA Excel
スポンサーリンク

概要

「この表、列の順番がよく変わるんだけど、“見出し名”で目的の列を取りたい」
「‘売上’という列が何列目かを、自動で数式に反映したい」

こういうときに使えるのが 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つが自然に書けるようになると、
「列番号を手で数える」「列追加で式が壊れる」という悩みから解放されます。

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