OpenOfficeで同順位が複数存在しても次に続く順位を欠番にしない PART2

前回は、並べ替えて処理する方法を紹介しました。
しかし、並べ替えることができない場合もあると思います。そんな場合に使える、並べ替えずに1位 1位 2位 3位 3位とランクを付ける方法です。

送信者 OpenOffice
このサンプルファイルは、SKYDRIVEからcalc121.odsをダウンロードしてください。
上の表は、A列とB列にそれぞれ、名前と契約件数が入力されています。

契約件数に応じて、1位から3位の人に金メダルから銅メダルを授与します。
但し、件数が同じ人が複数存在しても次に続く順位を欠番にしないことにしています。
また、表を並べ替えないことを条件にしています。
ただ、RANK関数で処理を行なうとD列のように結果が返されます。=IF(RANK(B2;$B$2:$B$11)<=3;CHOOSE(RANK(B2;$B$2:B11);"金メダル";"銀メダル";"銅メダル");"")
ですが、得たいのは、C列の結果です。そのために、E列とF列を設けます。



まず、E列で件数の要素を、重複を省いてすべて一回ずつ表示させます。

2行目 =IF(COUNTIF($B$2:B2;B2)=1;B2;"")
11行目 =IF(COUNTIF($B$2:B11;B11)=1;B11;"")
E列では、COUNTIF関数を用いてB列の要素が、その行にいたるまで何回目の登場かを調べています。(上の太字部分)。このために、COUNTIF関数の範囲の起点を絶対参照で固定して、終点を一行ずつ下げる事にしています。
ここで、1が返されたら、B2の要素をE列に書き出します。もしも既に登場していればCOUNTIF関数で2以上が返されるはずなので、この場合はE列に書き出しません。

次に、F列でランクを返します。

2行目 =IF(NOT(E2="");RANK(E2;$E$2:$E$11);"")
11行目 =IF(NOT(E11="");RANK(E11;$E$2:$E$11);"")
もしもE列のセルが空白の時にはF列も空白にします。空白でなければ、RANK関数で順位を返す処理をします。
ここまでで前準備が完了しました。
E列とF列は非表示にすることもできます。

C列に授与するメダルを表示します。

C2セルを例にとって説明します。
=IF(VLOOKUP(B2;$E$2:$F$11;2;0)<=3;CHOOSE(VLOOKUP(B2;$E$2:$F$11;2;0);"金メダル";"銀メダル";"銅メダル");"")

=VLOOKUP(B2;$E$2:$F$11;2;0)
VLOOKUP関数を用いて、B2セルの件数をE2:F11の範囲から検索します。
そしてその2行目の値を返します。
ここで、E列のデータが昇順に並んでいないため、データ順序を0に指定しておく必要があります。

もしもこれで3以下の数字が返されたら、メダルの種類を特定することにします。
=CHOOSE(VLOOKUP(B2;$E$2:$F$11;2;0);"金メダル";"銀メダル";"銅メダル")
太字の部分は、3位以内かどうかを調べた部分と同じ数式です。
ここで返される1から3の数字をINDEXとしてCHOOSE関数でメダルを返します。


ここで使用した関数関数名:CHOOSE関数
書式:=CHOOSE(インデックス;値1;値2;値3;値4;.......)
何ができる:インデックスで指定された順番の値を返す。
平たく書くと:=CHOOSE(1;"A";"B";"C";"D")でインデックスが1のときにAが、2のときBが返される。

関数名:VLOOKUP関数
書式:=VLOOKUP(検索値;検索範囲;範囲内での列番号;データ順序)
何ができる:検索範囲内で検索値を調べて、指定された列番号のデータを返す。
平たく書くと:=VLOOKUP("A11";B2:D11;3;0) これでB列からA11を検索して3行目(D列)から値を返す。
データ順序:1(true)のとき検査値が見つからないとき、検査値未満で最も大きい値を検査値とします。1(true)を指定する場合、あるいは空白にする場合は検索範囲を昇順に並べ替えておくことが必要。
データ順序:0(false)のとき:検査値と完全に一致する値を検索します。

関数名:RANK関数
書式:=RANK(検査値;検査範囲;タイプ)
何ができる:検査値が検査範囲の中で何番目の数値かを返す。
平たく書くと:=RANK(3;A1:A10;0) で3がA1からA10の範囲で何番目に大きいかを返す。
タイプを0か、空白にすると一番大きい値に1を返します。*タイプを空白にした書式は上の例を参考にしてください。
タイプを0以外の数値にすると、一番小さい値に1を返します。=RANK(3;A1:A10;1) で3が範囲内で何番目に小さいかを返します。

関数名:COUNTIF関数
書式:=COUNTIF(検査範囲;検査値)
何ができる:検査値が検査範囲の中で何回登場するかを数える。
平たく書くと:=COUNTIF(A1:A10;"ABC") でABCがA1からA10の範囲で何回登場するかを返す。
この記事をクリップ!