RANK関数の使い方|順位付けの基本と応用
RANK関数は、指定した範囲内でのデータの順位を求める関数です。売上成績の順位付けや試験結果のランキング作成など、業務のさまざまな場面で使われます。Excel 2010以降ではRANK.EQとRANK.AVGの2種類が用意されており、同じ値がある場合の処理方法が異なります。
RANK関数の基本構文
RANK関数(およびRANK.EQ関数)は、指定した値が範囲内で何番目かを返します。
=RANK(数値, 参照, [順序])
引数の説明
| 引数 | 説明 | 必須/任意 |
|---|---|---|
| 数値 | 順位を調べたい値またはセル | 必須 |
| 参照 | 順位を計算する範囲 | 必須 |
| 順序 | 0または省略で降順、1で昇順 | 任意 |
降順と昇順の違い
| 順序 | 動作 | 用途 |
|---|---|---|
| 0(または省略) | 大きい値から順位付け | 売上ランキング、成績順位 |
| 1 | 小さい値から順位付け | タイムランキング、コスト順位 |
基本的な使い方:売上順位を求める
担当者別の売上データに順位を付ける例です。
| A列:担当者 | B列:年間売上 | C列:順位 |
|---|---|---|
| 田中 | 15800000 | |
| 佐藤 | 12300000 | |
| 山田 | 18500000 | |
| 鈴木 | 9800000 | |
| 高橋 | 16200000 |
C2セルに以下の数式を入力し、C6までコピーします。
=RANK(B2, $B$2:$B$6)
結果は以下のとおりです。
| 担当者 | 年間売上 | 順位 |
|---|---|---|
| 田中 | 15800000 | 3 |
| 佐藤 | 12300000 | 4 |
| 山田 | 18500000 | 1 |
| 鈴木 | 9800000 | 5 |
| 高橋 | 16200000 | 2 |
参照範囲を$B$2:$B$6と絶対参照にすることで、数式をコピーしても範囲がずれません。
昇順で順位を付ける
タイムや費用など、小さい値が良い場合は第3引数に1を指定します。
=RANK(B2, $B$2:$B$6, 1)
この場合、最も小さい値が1位になります。
RANK.EQとRANK.AVGの違い
Excel 2010以降では、RANK関数の代わりにRANK.EQとRANK.AVGが推奨されています。
RANK.EQ関数
RANK.EQ関数は、同じ値がある場合に上位の順位を返します。従来のRANK関数と同じ動作です。
=RANK.EQ(数値, 参照, [順序])
RANK.AVG関数
RANK.AVG関数は、同じ値がある場合に平均の順位を返します。
=RANK.AVG(数値, 参照, [順序])
動作の比較
以下のデータで2つの関数の結果を比較します。
| A列:氏名 | B列:点数 | C列:RANK.EQ | D列:RANK.AVG |
|---|---|---|---|
| 田中 | 85 | 1 | 1 |
| 佐藤 | 78 | 3 | 3.5 |
| 山田 | 78 | 3 | 3.5 |
| 鈴木 | 92 | 1 | 1 |
| 高橋 | 92 | 1 | 1 |
この例では92点が2人、78点が2人います。
RANK.EQ関数は同点の場合に上位の順位(小さい番号)を返します。92点の2人はともに1位、78点の2人はともに3位になります。2位が飛ばされる点に注意してください。
RANK.AVG関数は同点の場合に平均の順位を返します。78点の2人は本来3位と4位ですが、平均の3.5位が返されます。
どちらを使うべきか
| 場面 | 推奨関数 |
|---|---|
| 一般的なランキング表 | RANK.EQ |
| 統計的な分析 | RANK.AVG |
| 順位が飛ばない方がよい場合 | RANK.AVG |
| 従来のRANK関数と同じ動作が必要な場合 | RANK.EQ |
実務では、RANK.EQ関数を使うケースが多いです。
同順位の処理テクニック
同じ値がある場合に順位が重複しないようにする方法を紹介します。
COUNTIF関数で重複順位を解消する
RANK.EQ関数とCOUNTIF関数を組み合わせて、同順位のデータに連番を振ります。
=RANK.EQ(B2, $B$2:$B$10) + COUNTIF($B$2:B2, B2) - 1
この数式は、同じ値が複数ある場合に、データの出現順で順位をずらします。最初に出てきた値はそのままの順位、2番目以降は+1、+2…と加算されます。
結果の例
| 氏名 | 点数 | RANK.EQ | 修正後順位 |
|---|---|---|---|
| 田中 | 85 | 2 | 2 |
| 佐藤 | 78 | 4 | 4 |
| 山田 | 92 | 1 | 1 |
| 鈴木 | 78 | 4 | 5 |
| 高橋 | 85 | 2 | 3 |
佐藤と鈴木は同じ78点ですが、修正後は4位と5位に分かれます。
条件付きの順位付け
特定のグループ内での順位を求めたい場合は、COUNTIFS関数を使った方法が有効です。
部門内での順位
各部門内での売上順位を求めます。
| A列:部門 | B列:担当者 | C列:売上 |
|---|---|---|
| 営業1課 | 田中 | 5200000 |
| 営業2課 | 佐藤 | 3800000 |
| 営業1課 | 山田 | 4800000 |
| 営業2課 | 鈴木 | 4100000 |
| 営業1課 | 高橋 | 6100000 |
D2セルに以下の数式を入力します。
=COUNTIFS($A$2:$A$6, A2, $C$2:$C$6, ">" & C2) + 1
この数式は、同じ部門内で自分より売上が大きいデータの件数を数え、1を加えることで順位を算出します。
| 部門 | 担当者 | 売上 | 部門内順位 |
|---|---|---|---|
| 営業1課 | 田中 | 5200000 | 2 |
| 営業2課 | 佐藤 | 3800000 | 2 |
| 営業1課 | 山田 | 4800000 | 3 |
| 営業2課 | 鈴木 | 4100000 | 1 |
| 営業1課 | 高橋 | 6100000 | 1 |
よくあるエラーと対処法
参照範囲の絶対参照忘れ
RANK関数で最も多いミスは、参照範囲を絶対参照にし忘れることです。
# 間違い(コピーすると範囲がずれる)
=RANK(B2, B2:B10)
# 正しい
=RANK(B2, $B$2:$B$10)
#N/Aエラー
参照範囲内に数値でないセルがある場合や、数値引数が範囲内に存在しない場合に発生します。データに空白や文字列が混在していないか確認してください。
順位が飛ぶ問題
RANK.EQ関数では同順位のデータがあると順位が飛びます。これは仕様です。連続した順位が必要な場合は、前述のCOUNTIF関数を組み合わせた方法を使用してください。
まとめ
RANK関数は、データに順位を付ける基本的な関数です。
- RANK.EQ関数は同じ値に上位の順位を割り当てる
- RANK.AVG関数は同じ値に平均の順位を割り当てる
- 参照範囲は必ず絶対参照にする
- 同順位を解消するにはCOUNTIF関数と組み合わせる
- 条件付きの順位にはCOUNTIFS関数を活用する
- 順位が飛ぶのはRANK.EQの仕様であり、エラーではない
なお、RANK関数はGoogle スプレッドシートでも同じ構文で利用できます。成績管理や売上ランキングなど、業務データの順位付けに幅広く活用できる関数です。用途に応じてRANK.EQとRANK.AVGを使い分けましょう。