概要
「点数に応じて評価ランクを決めたい」「売上に応じて手数料率を決めたい」
こういう“範囲でざっくり当てはめる”ときに使うのが MATCH関数の近似一致(第3引数=1) です。
MATCH(検索値, 検索範囲, 1) は、
「検索値以下で最大の値」を探し、その“位置(何番目か)”を返します。
ただし、検索範囲は「昇順に並んでいること」が大前提です。
基本の考え方
書式と動き
=MATCH(検索値, 検索範囲, 1)
第3引数の「1」が「近似一致(昇順)」指定です。
動きはこうです。
- 検索範囲(たとえば点数の境界)を「小さい順(昇順)」に並べておく
- 検索値以下で最大の値を探す
- そのセルが「範囲内で何番目か」を返す
つまり、「この点数なら、どのランクの行に当てはまるか?」を、境界値表から自動判定してくれるイメージです。
具体例(点数から評価ランクを決める)
点数境界表の作り方
例えば次のような「点数→ランク」の表を用意します。
A列:境界点
B列:ランク
A2:0 / B2:D
A3:60 / B3:C
A4:70 / B4:B
A5:80 / B5:A
このとき、C2 にテストの点数(例:75点)が入っているとします。
MATCH(1) で「どのランク行か」を探す
C2 の点数がどこに当てはまるかを調べる式はこうなります。
=MATCH(C2, $A$2:$A$5, 1)
C2=75なら、
- A2=0 → C2以上
- A3=60 → C2以上
- A4=70 → C2以上
- A5=80 → C2より大きいので超えてしまう
「検索値以下で最大」なので、境界点70の行(A4)が採用されます。
A2:A5 の中で A4 は4行中3番目なので、結果は「3」と返ります。
INDEXと組み合わせてランク文字を取る
ランクそのもの(A/B/C/D)を取りたいので、INDEXと組み合わせます。
=INDEX($B$2:$B$5, MATCH(C2, $A$2:$A$5, 1))
C2=75 の場合、MATCHが「3」を返し、
INDEX(B2:B5,3) → B4(つまりランクB)を返します。
これが「点数から評価を近似一致で引く」基本パターンです。
税率や手数料率への応用
近似一致は、「金額帯ごとに税率・手数料率が変わる」といったケースでもよく使われます。
例えば、売上金額に応じて手数料率を決める表:
A列:売上下限
B列:手数料率
A2:0 / B2:0%
A3:100000 / B3:3%
A4:300000 / B4:5%
A5:500000 / B5:8%
D2 に売上金額が入っているとして、その金額に応じた手数料率を求める式はこうです。
=INDEX($B$2:$B$5, MATCH(D2, $A$2:$A$5, 1))
D2=250000 なら、
0 → OK
100000 → OK
300000 → 超える
なので、境界100000の行(A3)が選ばれ、「3%」が返ります。
ここからさらに「実際の手数料額」を計算するなら、
=D2 * INDEX($B$2:$B$5, MATCH(D2, $A$2:$A$5, 1))
のように掛け算すればOKです。
近似一致を使うときの絶対ルールと注意点
昇順ソートが必須
MATCH(1) を使うときの最大のルールは、
検索範囲を昇順(小→大)に並べておくことです。
昇順になっていないと、
- 間違った位置で止まってしまう
- 想定外の行を拾ってしまう
など、静かに“変な結果”を出します。
近似一致を使う前に、必ず「境界値の列を小さい順に並んでいるか」を確認してください。
「検索値より小さい値が1つもない」とエラーになる
例えば、境界が「60, 70, 80」のように設定されていて、検索値が「50」の場合、
「検索値以下の値」が存在しないため #N/A になります。
その場合は、IFERROR で補正したり、境界0を加えるなどしておくのが安全です。
=IFERROR(
INDEX($B$2:$B$5, MATCH(C2, $A$2:$A$5, 1)),
"範囲外"
)
ピッタリ一致する場合ももちろんOK
境界70のときに検索値が70なら、その「70」の位置がそのまま返ってきます。
つまり「完全一致」と「近似一致(以下の最大)」をひとまとめで扱ってくれます。
例題
問題1: A2:A5 に「0,60,70,80」、B2:B5 に「D,C,B,A」の評価ランクが入っています。C2 の点数に対して、適切な評価ランクを D2 に表示してください(近似一致を使用)。
=INDEX($B$2:$B$5, MATCH(C2, $A$2:$A$5, 1))
問題2: A2:A5 に売上境界「0,100000,300000,500000」、B2:B5 に手数料率「0%,3%,5%,8%」が入っています。D2 の売上金額に応じた手数料率を E2 に表示してください(近似一致)。
=INDEX($B$2:$B$5, MATCH(D2, $A$2:$A$5, 1))
問題3: 問題2の式を使い、D2 の売上金額に応じた「手数料額(=売上×率)」を F2 に表示してください。
=D2 * INDEX($B$2:$B$5, MATCH(D2, $A$2:$A$5, 1))
問題4: 問題1の点数評価で、C2 の点数がどのランクにも当てはまらない(境界より小さい)場合に「範囲外」と表示するよう、D2 に式を書いてください。
=IFERROR(
INDEX($B$2:$B$5, MATCH(C2, $A$2:$A$5, 1)),
"範囲外"
)
問題5: 1行目 A1:E1 に「0,100,200,300,400」の境界値が昇順に入っています。G1 の数値に対して、「境界の何番目に当たるか」を H1 に表示してください(横方向の近似一致)。
=MATCH(G1, A1:E1, 1)
まとめ
MATCH(1) の近似一致検索は、
- 境界表を用意する
- 昇順ソートしておく
MATCH(検索値, 境界列, 1)で「どの行か」INDEX(値列, その位置)で「実際の値」を取る
という流れで使います。
点数→評価、売上→手数料率、年齢→会費区分…といった「○○以上 △△未満で区分を決める」処理は、
ほぼすべてこのパターンで書けるようになります。
