概要
「売上が少ない順に下位3件を出したい」
「点数の低い人ベスト5を出したい」
「エラーや不良数が多い“ワーストn件”を抜き出したい」
こういう“下位n件”を取るときの基本になるのが SMALL(スモール)関数です。
SMALL は
「範囲の中から、下から n 番目に小さい値を返す」
関数です。
これを縦にコピーしたり、INDEX+MATCH などと組み合わせることで、
「下位n件の値」や「下位n件の行情報」が簡単に取れるようになります。
SMALL の基本
SMALL の書式とイメージ
=SMALL(範囲, n)
範囲
順位を付けたい数値の集合(点数、売上、金額、所要時間など)
n
小さいほうから何番目か
1 → 最小値(1位:一番小さい値)
2 → 下から2番目に小さい値
3 → 下から3番目に小さい値…
例:D2:D10 に点数が入っているとします。
=SMALL(D2:D10, 1) ' 最小値
=SMALL(D2:D10, 2) ' 2番目に小さい値
=SMALL(D2:D10, 3) ' 3番目に小さい値
「LARGE が上位(大きい順)、SMALL が下位(小さい順)」と覚えておくと整理しやすいです。
下位n件の「値」だけを抽出する
n を固定して下位n件を出す基本パターン
例:D2:D10 に点数が入っていて、
下位3件の点数を F2:F4 に表示したいとします。
単純に書くなら、
F2:
=SMALL(D2:D10, 1)
F3:
=SMALL(D2:D10, 2)
F4:
=SMALL(D2:D10, 3)
と、n だけ変えて書けばOKです。
ROW を使って「n を自動で増やす」パターン
毎回 n を手書きする代わりに、行番号を使って自動で増やすこともできます。
F2 に次の式を書いて、F4 まで下にコピーします。
=SMALL($D$2:$D$10, ROW(A1))
ROW(A1) は 1、
F3 行では ROW(A2) が 2、
F4 行では ROW(A3) が 3 になるので、
F2 → 下位1件目(最小)
F3 → 下位2件目
F4 → 下位3件目
というふうに、「コピーするだけで下位n件」が自動で並びます。
下位n件の「名前」や「商品」をセットで抜き出す
INDEX+MATCH+SMALL の基本パターン
実務で知りたいのは「値そのもの」よりも、
「値が小さい人の名前」「売上が少ない商品の名前」のほうですよね。
こういうときに使うのが
INDEX(値を取り出す)+MATCH(行番号を探す)+SMALL(順位づけ)
の組み合わせです。
前提:
A2:A10:名前
B2:B10:科目
C2:C10:点数
点数が低い順に、下位3名の「名前」を E2:E4 に表示したいとします。
1位(最小点の人)の名前を E2 に表示する式:
=INDEX($A$2:$A$10,
MATCH(SMALL($C$2:$C$10, 1), $C$2:$C$10, 0))
意味をかみ砕くと、
SMALL($C$2:$C$10, 1)で「一番低い点数」を求めるMATCH(その点数, $C$2:$C$10, 0)で「その点数が C列の何行目か」を探すINDEX($A$2:$A$10, その行番号)で「対応する名前」を返す
これで「最低点の人の名前」が取れます。
2番目・3番目に点数が低い人も、SMALL の n だけ変えればOKです。
E3:
=INDEX($A$2:$A$10,
MATCH(SMALL($C$2:$C$10, 2), $C$2:$C$10, 0))
E4:
=INDEX($A$2:$A$10,
MATCH(SMALL($C$2:$C$10, 3), $C$2:$C$10, 0))
下位n件を「1つの式をコピーするだけ」で出す
ROW を使って n を自動化する
毎回 1,2,3… と書くのは面倒なので、
ROW を使って n を自動増加させる方法が便利です。
先ほどの例の続きで、
E2 に1つだけ式を書き、E4 までコピーして使いたいとします。
E2 に次の式を書きます。
=INDEX($A$2:$A$10,
MATCH(SMALL($C$2:$C$10, ROW(A1)), $C$2:$C$10, 0))
動き:
- E2:ROW(A1)=1 → 下位1件目(最小点の人)
- E3:ROW(A2)=2 → 下位2件目
- E4:ROW(A3)=3 → 下位3件目
という具合に、コピーするだけで「下位1〜n位」の名前を自動で取れます。
この「ROW(A1) を n の代わりに使う」パターンは、
上位(LARGE)でも下位(SMALL)でも共通してよく使う定番テクニックです。
下位n件を「行ごと」抽出する考え方
1件ぶんを行単位で取るイメージ
たとえば、A2:D10 に
A列:商品コード
B列:商品名
C列:担当者
D列:売上
が入っていて、
売上が少ない順に下位3件の「行全体」を別表に出したいとします。
1件目(売上が最小の行)の「商品名」を E2 に表示する式は、先ほどと同じ形です。
=INDEX($B$2:$B$10,
MATCH(SMALL($D$2:$D$10, 1), $D$2:$D$10, 0))
同じ行の「商品コード」「担当者」も取りたい場合は、
INDEX の第1引数(取りたい列)だけを A列・C列に変えればOKです。
売上最小の行の「商品コード」を F2 に表示:
=INDEX($A$2:$A$10,
MATCH(SMALL($D$2:$D$10, 1), $D$2:$D$10, 0))
売上最小の行の「担当者」を G2 に表示:
=INDEX($C$2:$C$10,
MATCH(SMALL($D$2:$D$10, 1), $D$2:$D$10, 0))
下位2件目・3件目ぶんも欲しければ、
SMALL の n を ROW(A1), ROW(A2), ROW(A3)…で動かしていけば良い、という考え方になります。
よくあるつまずきと注意点
SMALL は数値専用
SMALL の対象は「数値」だけです。
文字列や空白が混ざっていると、意図しない結果になることがあります。
「空白を除外したい」「0を除外したい」などの要望がある場合は、
- 先に FILTER などで絞り込む
- 条件付きで別列に数値だけをコピーしてから SMALL をかける
といった工夫が必要になることがあります。
同じ値が複数ある場合(同率順位)
例えば点数が
60, 70, 70, 80
のとき、
SMALL(範囲,1) = 60
SMALL(範囲,2) = 70
SMALL(範囲,3) = 70
のように、「同じ値」を複数回返します。
同率の人も下位扱いでよければ問題ありませんが、
「同じ値は1つとして扱いたい」場合は、UNIQUE と組み合わせる必要が出てきます。
例題
問題1
D2:D10 に不良件数が入っています。
この中から「最小の不良件数(下位1件目)」を E2 に表示する式を書いてください。
=SMALL(D2:D10, 1)
問題2
D2:D10 の中から「下位3件の不良件数」を E2:E4 に表示したいとします。
E2 に1つだけ式を書き、下にコピーして使えるようにしてください。
=SMALL($D$2:$D$10, ROW(A1))
問題3
A2:A10 に名前、C2:C10 にテストの点数が入っています。
点数が最も低い人の名前を E2 に表示する式を書いてください。
=INDEX(A2:A10,
MATCH(SMALL(C2:C10, 1), C2:C10, 0))
問題4
A2:A10 に名前、C2:C10 に点数が入っています。
点数が低い順に下位3人の名前を E2:E4 に表示したいとします。
E2 に1つだけ式を書き、下にコピーして使えるようにしてください。
=INDEX($A$2:$A$10,
MATCH(SMALL($C$2:$C$10, ROW(A1)), $C$2:$C$10, 0))
問題5
A2:A10 に商品名、D2:D10 に売上金額が入っています。
売上が2番目に小さい商品の名前を F2 に表示する式を書いてください。
=INDEX(A2:A10,
MATCH(SMALL(D2:D10, 2), D2:D10, 0))
まとめ
「下位n件を抽出 → SMALL」の型は、上位の LARGE と対になる形で覚えると簡単です。
数値だけ欲しいときの基本形:
=SMALL(範囲, n)
=SMALL($範囲$, ROW(A1)) ' コピーで n を自動増加
「下位n件の名前・商品など」を取りたいときの基本形:
=INDEX(取りたい列,
MATCH(SMALL(評価列, n), 評価列, 0))
=INDEX($取りたい列$,
MATCH(SMALL($評価列$, ROW(A1)), $評価列$, 0))
この型さえ身につければ、
- 売上ワーストn件
- 点数の低い人n名
- 不良が多い(or少ない)データの抽出
といった“ワースト系・下位系ランキング”を、
どんな表でも素早く作れるようになります。
