【Excel関数】データ並び替えをリアルタイムで反映する方法

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の場合は小さい方からの順位を指定します。

安い順に並べ替え

ここでは、値が小さい方から並べるのでSMALL関数です。ボウリングのスコアは大きい方から並べるので、LARGE関数を使います。使い方は同じです。

値(J2): =SMALL(F$2:F$10,A2)

キー項目を元に値を埋めていく

新表のWork値をキーに、他の列の値を元表から取得します。

キー項目を復号

まずは、合計値を設定します。

ROUNDDOWN関数を使って、キー項目用管理情報を切り捨てます。
管理情報を小数第何位にしたかで、第2引数の値を調整します。
今回は、小数点以下は不要なのですべて切り捨てます。

キー項目を複号

キー値にするために付加した小数点以下の値を切り捨てます。ボウリングスコアの場合もここは同じです。

値(I2): =ROUNDDOWN(J2,0)

名称を設定

2種類の関数を組み合わせます。
対象の値が何行目にあるのかを検索し、配列から取得します。

キー項目を利用して名称を設定

キー項目を利用して、元の表から名称を取得します。INDEX関数とMATCH関数を組み合わせます。

値(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文を入れました。

ご意見やご感想などお聞かせください! コメント機能です。

タイトルとURLをコピーしました