RANK 関数


書式 :RANK(数値, 範囲, [順序])

機能 :指定した範囲内で、指定した数値が何番目かを返します

解説 :数値の順序を求めるときに使います

順位を求める

下の図は、試験の結果を入力したリストです。人数が少ないですが、気にしないでください。さて、点数の大きい順に順位を決めるとき、すぐに思いつくのはRANK関数です。

セルC2に「=RANK(B2,$B$2:$B$6,0)」という式を入力します。この式をセル範囲C3:C6にコピーしますから、2番目の引数[範囲]は[F4]キーを押して絶対参照にするのを忘れないで下さい。さて、式を入力したらCtrlキーを押しながらEnterキーを押します。こうするとアクティブセルが移動しません。この後、セルC2のフィルハンドルをドラッグするのですから、アクティブセルが移動しない方が便利です。セルC2のフィルハンドルをセルC6までドラッグすれば完了です。

より小さい数値を1位とするか、それとも大きい数値を1位にするかを決めるのは、3番目の引数[順序]です。引数[順序]に 0 を指定すると、テストの点数のように大きい数値を1位とみなします。引数[順序]に 0ではない数値 を指定すると、競争のタイムのように小さい数値を1位と判断します。

同位のない順位を求める

RANK関数は使い方が簡単です。昔からある関数のひとつで、雑誌やマニュアル本などでもビギナーにオススメの関数としてよく紹介されます。その使い方は、たいてい上に書いたような例で解説されています。

ところが、いざ実務で使おうとすると壁にぶち当たります。次のように同点がいるケースをご覧ください。

田中さんと土屋さんが、どちらも73点です。雑誌の解説とは違い、実務では当然起こりうる結果です。このとき、RANK関数が返すのは「1位・2位・2位・4位・5位」です。2位が二人いるのですから、次の3位を抜かして4位からランキングされています。これはこれでRANK関数の仕様なのですが、この仕様で納得してくれる上司ばかりではありません。

一般的には「同点がいたら○○が××な者が上」みたいなルールが存在します。最初は「同位の場合は欠席日数の少ない者が上」というルールにします。

B列に「欠席日数」を追加しました。田中さんは2日、土屋さんは1日です。したがって、二人が同点の場合は土屋さんの順位を上と判断します。

こうした二段階の順位付けで大事なことは、順位と順位を合体させて判定するということです。上図では、D列に判定のため計算セルを設けました。ここには「=RANK(C6,$C$2:$C$6,0)*10+RANK(B6,$B$2:$B$6,1)」というような式を入力しています。この式は「点数の大きい順位」を10倍して「欠席日数の少ない順位」と合計せよという意味です。田中さんの場合、点数の大きい順位は第2位です。これは土屋さんも同じ。次に田中さんの「欠席日数の少ない順位」を調べると第4位ですから、2×10+4=24という結果になります。同じように土屋さんは「欠席日数の少ない順位」が第2位ですから、2×10+2=22となります。この計算結果を最後にE列でランク付けします。まず十の位で判定し、十の位が同じなら一の位で判定するという二段階のランク付けができました。

次に「ルールなんかどうでもいいから、とにかく同位が存在しないように順位を決めてくれ」という、わがままなリクエストにお応えしましょう。

そもそも同位で悩むのは、田中さんの73点と土屋さんの73点が等しいからです。実際は73点だったにしても、どうにかしてこの2つの73点に違いを付ければ別の順位にできます。そこで、ここでは二人の名前が入力されているセルの行番号で順位を分けることにしましょう。

行番号の取得にはROW関数を使います。ROW関数は引数を省略すると、ROW関数が入力されているセルの行番号を返します。ROW関数については下記の解説をご覧ください。

ROW関数

C列では、本来の点数であるB列に「(ROW()/10)」を加えています。田中さんの場合、この行は2行目ですからROW関数が 2 を返します。その2を10で割ると0.2です。したがって、73+0.2=73.2という結果になります。対して土屋さんは6行目ですから73+0.6=73.6となり、これで二人の点数に少しだけ違いを付けることができました。後はこの計算結果をRANK関数で判定すれば解決です。