Excel関数 逆引き集 | 近似一致検索 → MATCH(1)

Excel VBA Excel
スポンサーリンク

概要

「点数に応じて評価ランクを決めたい」「売上に応じて手数料率を決めたい」
こういう“範囲でざっくり当てはめる”ときに使うのが MATCH関数の近似一致(第3引数=1) です。

MATCH(検索値, 検索範囲, 1) は、
「検索値以下で最大の値」を探し、その“位置(何番目か)”を返します。
ただし、検索範囲は「昇順に並んでいること」が大前提です。


基本の考え方

書式と動き

=MATCH(検索値, 検索範囲, 1)

第3引数の「1」が「近似一致(昇順)」指定です。
動きはこうです。

  1. 検索範囲(たとえば点数の境界)を「小さい順(昇順)」に並べておく
  2. 検索値以下で最大の値を探す
  3. そのセルが「範囲内で何番目か」を返す

つまり、「この点数なら、どのランクの行に当てはまるか?」を、境界値表から自動判定してくれるイメージです。


具体例(点数から評価ランクを決める)

点数境界表の作り方

例えば次のような「点数→ランク」の表を用意します。

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(値列, その位置) で「実際の値」を取る

という流れで使います。

点数→評価、売上→手数料率、年齢→会費区分…といった「○○以上 △△未満で区分を決める」処理は、
ほぼすべてこのパターンで書けるようになります。

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