Excel関数を組み合わせてデータを並び替え、ボウリング大会の順位表を作りました。
もちろんスコアが重複しても対応可能です。当日になって参加者が増減することも想定し、ある程度は対応でるようにしておきました。
定期的な処理はマクロでの対応が最適ですが、リアルタイムでデータの順番を確認したい場合やマクロを実行できない環境では、関数での並び替え対応になります。
ここでは、Excel関数による並べ替えのやり方をまとめておきます。
例は、Officeのサポートページからいただいてきました。
ワークシートの作成環境は、Excel 2013です。
2010でも動作確認できています。2016でも大丈夫なように作っています。
なお、古いExcel(2007以前)では動作しない関数を使っています。
やりたいこと(基本思想)
元の表にデータが入力されたら、リアルタイムで順位に沿って並べ替えて、新しい表に反映させていきます。
ボウリングのスコアは重複することがあるので、同じ順位に複数人が存在することも想定しています。
例は果物名で作ってしまいましたw
ナシの単価を69円にして、合計がリンゴの8760円と同値になった場合、順位がどちらも6位になって、どちらの果物名も表示されます。
単純にスコアのみでのソートはできないので、いったん合計値をWork値化して処理後、そのまま複合して新しい表の値に使います。
全体構成
行ごとに、一意になるワーク値を設定して、その値を並び替えます。
並び替えたら、ワーク値を元に戻して、画面に表示させます。
関数なので、すべて連動して一瞬で動くものですが、処理順はこのような流れです。
キー項目を作成(Work値)
各行の値が一意になるように、Work値としてキー項目を作成します。
並べ替え部分や複合部分と絡む重要なところです。
合計が同値(同じ順位)になることを想定しています。
ここでは、No.の値を合計の小数第3位に設定するかたちにしています。Work値から正しい値を取得するために必要な手順です。
小数部分は後で切り捨てます。
No.が3桁になっても対応できるようにしました。(見やすいということもありますw)
どの位置で調整するかは、必要に応じて適宜判断してください。
値(F2): =E2+A2/1000
Excel関数で並べ替え(Work値)
キー項目をデータの大小で順番に並べ替えます。
LARGE関数/SMALL関数
第1引数で指定した母集団(表形式)に対して、第2引数で指定する順位番号に該当する値を返します。
LARGEの場合は大きい方からの順位を、SMALLの場合は小さい方からの順位を指定します。
値(J2): =SMALL(F$2:F$10,A2)
キー項目を元に値を埋めていく
新表のWork値をキーに、他の列の値を元表から取得します。
キー項目を復号
まずは、合計値を設定します。
ROUNDDOWN関数を使って、キー項目用管理情報を切り捨てます。
管理情報を小数第何位にしたかで、第2引数の値を調整します。
今回は、小数点以下は不要なのですべて切り捨てます。
値(I2): =ROUNDDOWN(J2,0)
名称を設定
2種類の関数を組み合わせます。
対象の値が何行目にあるのかを検索し、配列から取得します。
値(H2): =INDEX(B:B,MATCH(J2,F:F,0))
INDEX関数
第1引数で指定した母集団(表形式)に対して、第2、3引数で指定する行番号、列番号に該当する値を返します。
なお、列番号(第3引数)は省略可能です。
第1引数は、範囲指定か配列です。
Excel的な考え方なので、1次元配列の場合は行番号のみ指定すれば値を参照できます。
MATCH関数
第1引数で指定した値(検査値)が、第2引数で指定した母集団内のどこにあるか、位置番号を返します。
第3引数で母集団を検索する方法を決めます。「0」が完全一致です。規定値が「1」なので、省略すると検査値以下の最大の値を検索します。
順位番号を付ける
RANK.EQ関数を使って、順位を振ります。
第1引数の値が、第2引数で指定した母集団(1次元配列)内で何番目かを返します。
第3引数は、何番目かを昇順(1)、降順(0: 規定値)のどちらで数えるかです。
値(G2): =RANK.EQ(I2,I$2:I$10,1)
関数にするメリット
あらかじめ関数を組んでおくことで、当日は値を入力することだけに集中できます。
マクロでの処理と比べると、途中で入力ミスに気づいたり、メンバーの増減があったりしても、並べ替え処理をやり直す必要がありません。
範囲指定誤りや、コピーミスも避けられます。
参加人数が多いと、どうしてもリスクとして残ってしまう部分です。
前もって確認済みのシートを利用することで、いくつかのリスクは軽減できます。
ボウリングのスコア計算シートでは、メンバーが入力されていたら計算する、というかたちでIF文を入れました。
ご意見やご感想などお聞かせください! コメント機能です。