MATCH関数の使い方|照合の型0・1・-1の違いと#N/Aの直し方

MATCH関数は、検査範囲の中で探す値が何番目にあるかを数値で返す関数です。値そのものは取り出しません。実務では第3引数の照合の型に 0 を指定した完全一致が基本形。省略すると近似一致になり、エラーが出ないまま誤った位置が返ります。

この記事でわかること

  • MATCH関数の3つの引数と、返ってくる数値の意味
  • 照合の型 0・1・-1の違いと、並び順の前提
  • MATCH単体の使いどころ(存在チェック・2つのリストの差分・段階判定)
  • #N/Aが出るときの原因と直し方
  • XMATCH関数・COUNTIF関数との使い分け


目次

MATCH関数の構文と引数

構文

=MATCH(検査値, 検査範囲, [照合の型])
引数指定するもの注意点
検査値探したい値ワイルドカードが使えるのは照合の型が 0 のときだけ
検査範囲探す先のセル範囲1行または1列で指定する
照合の型0=完全一致/1=以下の最大値/-1=以上の最小値省略すると 1 扱い。実務では 0 を明示する

返るのは範囲の中での位置です。検査範囲が $F$2:$F$100 で 3 が返ったなら、それはシートの4行目を意味します。シートの行番号がそのまま返るわけではありません。

MATCH関数はExcel 2016以降のどのバージョンでも使えます。動的配列のような世代差はありません。

MATCH関数の使い方|照合の型0・1・-1の違いと#N/Aの直し方の解説図1

基本の使い方

商品マスタのF列に商品コードが並んでいるとします。「A-102」が上から何番目かを数える式です。

=MATCH("A-102", $F$2:$F$100, 0)

条件を直接書かず、入力セルを参照させると使い回せます。

=MATCH($A2, $F$2:$F$100, 0)

検査範囲は必ず絶対参照にする

$F$2:$F$100 のようにドル記号で固定します。固定せずに下へコピーすると範囲が1行ずつ下へずれ、下の行ほど位置がずれた値を返します。範囲を入力した直後にF4キーを押すと切り替わります。

値そのものは返らない

MATCHが返すのは位置の数値だけです。「A-102の商品名」が欲しいなら、その数値を受け取って値を取り出す関数と組み合わせます。INDEX関数とセットで使うのが定番の形です。

ただし位置の数値だけで足りる用途も多く、その場合はMATCH単体で完結します。次の章がその使いどころです。


照合の型3つの違い

この関数のつまずきどころは、ほぼ第3引数に集中しています。

照合の型探すもの検査範囲の並び順
0検査値と完全に一致する値不問(どんな並びでもよい)
1(省略時)検査値以下の最大値昇順に並んでいることが前提
-1検査値以上の最小値降順に並んでいることが前提

⛔ 省略すると静かに間違う

第3引数を省くと 1 として動きます。1 は範囲が昇順に並んでいることを前提に探すため、並んでいない表に対しては結果が当てになりません。

厄介なのは、#N/A にならずそれらしい数値が返ってくる点です。数式は動いているように見えるのに、取り出される値だけが違う。原因に気づくまで時間がかかる種類の事故なので、完全一致で使うなら 0 を必ず書いてください。

照合の型 1 が正しく効く場面

1 を使うのは、段階で判定したいときだけです。料金表・送料表・評価ランクのように「いくら以上ならこの区分」という表がこれに当たります。

E列に各段階の下限値を昇順で並べ、F列に区分名を置いた表を用意します。

=INDEX($F$2:$F$6, MATCH($B2, $E$2:$E$6, 1))

$E$2:$E$6 に 0 1000 5000 10000 50000 が入っていれば、B2が 7,200 のとき「5000以下の最大値」=3番目が選ばれ、F4の区分名が返ります。

⚠️ 1 は「検査値以下の最大値」を探すため、検査値が範囲の最小値より小さいと #N/A になります。段階表の先頭には必ず 0 などの下限を置いてください。

-1 は降順に並べた表で「以上の最小値」を探します。段階表を大きい順に作ってしまった場合に使いますが、昇順の 1 に統一するほうが読み手を迷わせません。

MATCH関数の使い方|照合の型0・1・-1の違いと#N/Aの直し方の解説図2

MATCH単体で使う4パターン

① 値があるかどうかを判定する

#N/A を返すかどうかで、存在チェックができます。

=ISNUMBER(MATCH($A2, $F$2:$F$100, 0))

マスタに存在すれば TRUE、なければ FALSE です。COUNTIF関数でも同じ判定はできますが、位置も一緒に欲しいならMATCH、件数だけでよいならCOUNTIFという分け方になります。

② 2つのリストの差分を出す

先月の名簿と今月の名簿を突き合わせ、増えた人・消えた人を洗い出す用途です。

=IF(ISNA(MATCH($A2, $F$2:$F$100, 0)), "新規", "継続")

同じ式を条件付き書式のルールに入れれば、差分の行に色を付けられます。逆向き(先月にいて今月にいない)も、範囲を入れ替えるだけで同じ形で書けます。

③ 表示する並び順を管理する

集計表を「マスタで決めた順」に並べたいとき、MATCHで並び順番号の列を作ります。

=MATCH($A2, $J$2:$J$10, 0)

J列に支店の正しい並びを置いておけば、この列を基準に並べ替えるだけで意図した順序になります。五十音順でも入力順でもない業務上の順番を保ちたい表で効きます。

④ 横方向に使って列番号を数える

MATCHは1行の範囲にも同じ形で使えます。見出し行を検査範囲にすると、「単価は左から何列目か」を毎回数え直せます。

=VLOOKUP($A2, $F$2:$H$100, MATCH($B$1, $F$1:$H$1, 0), FALSE)

列番号を数値で直書きした式は、マスタに列を1本挿入した瞬間に全部が別の列を指し始めます。MATCHに数えさせておけば、この事故が起きません。

MATCH関数の使い方|照合の型0・1・-1の違いと#N/Aの直し方の解説図3

うまくいかないときの原因と直し方

表示・症状主な原因直し方
#N/A検査値が検査範囲に存在しない下の「#N/Aの4つの原因」を上から確認する
#N/A照合の型 1 で、検査値が範囲の最小値より小さい段階表の先頭に 0 などの下限を置く
#N/A検査範囲を複数行×複数列で指定している検査範囲は1行または1列にする
#VALUE!照合の型に数値以外を入れている0・1・-1 のいずれかにする
誤った位置が返る(エラーなし)照合の型を省略している0 を明示して完全一致にする
下の行ほど位置がずれる検査範囲が相対参照のままコピーされた$F$2:$F$100 の形に固定する
取り出した値が1行ずれる取得側の範囲と開始行が違う両方の範囲を同じ行で始め、同じ行で終える
意図しない位置が返る検査値に * や ? が含まれていた~* ~? でエスケープする

#N/Aの4つの原因

見た目が同じでも一致しないことがあります。次の順に確認するのが早道です。判定用の式も添えます。

  1. 検査値が存在しない — =COUNTIF($F$2:$F$100, $A2) が 0 なら不在
  2. 前後に余分な空白がある — =TRIM(A2) の結果と元の値を見比べる
  3. 数値と文字列が混ざっている — =ISNUMBER(A2) と =ISNUMBER(F2) の結果が食い違えば型の不一致
  4. 全角と半角が混ざっている — =ASC(A2) で半角に寄せて比較する

3の型の不一致は、セルの左寄せ・右寄せでも見分けられます。数値は既定で右寄せ、文字列は左寄せです。

エラーを隠すなら IFNA

=IFNA(MATCH($A2, $F$2:$F$100, 0), "")

IFERROR関数でも隠せますが、#VALUE! のような設計ミスまで飲み込みます。「見つからない」だけを想定内として扱うなら、IFNAのほうが安全です。

MATCH関数の使い方|照合の型0・1・-1の違いと#N/Aの直し方の解説図4

似た関数との使い分け

関数・組み合わせ対応バージョン選ぶ場面
MATCH2016〜位置が欲しい。2016・2019の相手にも渡す
XMATCH365/2021〜末尾から検索したい。一致の条件を細かく指定したい
INDEX+MATCH2016〜位置から値を取り出す
COUNTIF2016〜位置は要らず、件数だけ知りたい
XLOOKUP2021〜位置を経由せず、1つの関数で値を引く
VLOOKUP2016〜左端列で引くだけの単純な引き当て

XMATCHとの違い

XMATCHは同じ「位置を返す関数」の後継です。違いは2つあります。

既定が完全一致であることが1つ目です。MATCHは省略時に近似一致へ倒れますが、XMATCHは省略しても完全一致で動きます。この記事で繰り返している事故が、そもそも起きません。

2つ目は末尾から検索できることです。第4引数で検索の向きを指定でき、同じ値が複数あるときに「最後の1件」を取れます。MATCHでこれを書くには別の工夫が要ります。

ただしXMATCHはMicrosoft 365とExcel 2021以降です。2019以前で開くと #NAME? になります。相手の環境が分からないファイルでは、MATCHのままにしておくのが安全です。


よくある質問

Q1:MATCH関数だけで値を取り出せますか?

取り出せません。MATCHが返すのは位置の数値だけです。値が欲しい場合はINDEX関数と組み合わせます。逆に、存在チェックや差分の判定のように位置の数値だけで完結する用途なら、単体で使えます。

Q2:照合の型を省略するとどうなりますか?

1(以下の最大値)として動きます。検査範囲が昇順に並んでいれば意図どおりですが、並んでいない表では見当違いの位置を返します。エラーにならず間違った値が返るのが最も厄介な点です。完全一致で使うなら 0 を必ず書いてください。

Q3:一致する値が複数あるとどうなりますか?

照合の型が 0 の場合、最初に一致した位置だけが返ります。2件目以降は取得できません。すべて必要ならFILTER関数(Excel 2021以降)を使うか、作業列に連番を振って「何件目か」を指定する形にします。

Q4:大文字と小文字、全角と半角は区別されますか?

大文字と小文字は区別されません。ABC と abc は同じ値として一致します。一方で全角と半角は別の文字として扱われ、一致しません。ASC関数やJIS関数で、あらかじめどちらかに寄せておくのが確実です。

Q5:「〇〇を含む」という条件で検索できますか?

できます。照合の型を 0 にしたうえで、"*"&$A2&"*" のようにアスタリスクで挟みます。? は任意の1文字です。* や ? そのものを探したいときは、直前に半角チルダ ~ を置きます。ワイルドカードが効くのは型が 0 のときだけです。

Q6:検査範囲に表全体を指定できますか?

できません。検査範囲は1行または1列で指定します。表全体から行と列の両方を特定したい場合は、MATCHを2本使い、縦方向と横方向でそれぞれ位置を出してINDEX関数に渡します。


まとめ

MATCHの要点
  • 返るのは範囲内の位置。シートの行番号ではない
  • 照合の型は必ず0。省略すると近似一致になり、誤った位置が静かに返る
  • 型 1 を使うのは段階判定のときだけ。昇順に並べ、先頭に下限を置く
  • 単体でも使える。存在チェック・差分抽出・並び順の管理が代表例
  • 検査範囲は1行または1列。エラーを隠すならIFERRORよりIFNA

※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、白石です。製造業の生産管理で15年、毎日の実績集計と帳票づくりをExcelでやってきました。マクロを組もうとして早々に挫折し、そこからは「関数と表の機能だけでどこまでやれるか」でしのいできた口です。部門では「この集計どうやるの」と聞かれる係になり、聞かれた内容を手元にメモし続けました。そのメモがいつのまにか、関数名ではなくやりたいことから引く形になっていて、それがこのサイトのもとになっています。Excelは同じことをやるのに何通りもやり方があって、しかもバージョンによって使える関数が違います。ここでは実際に動かして確かめた式だけを載せ、つまずきやすいところと使えないバージョンを先に書くようにしています。

目次