- ベストアンサー
レース結果の集計について
レース結果をエクセルを使って集計する事になりました。 データは次のように作成するのですが、最終的には各チームの上位3名の合計タイムを比べて、チームの順位を出さないといけません。 番号 名前 チーム名 タイム 1 ○○ ●●●● 25:01 2 △△ ▲▲▲▲ 26:13 3 □□ ●●●● 30:21 4 ◎◎ ●●●● 29:01 5 ◇◇ ▲▲▲▲ 22:45 6 ※※ ▲▲▲▲ 26:48 7 ○△ ▲▲▲▲ 30:21 8 ◇○ ■■■■ 21:47 9 ※◎ ■■■■ 19:37 10 □◇ ◎◎◎◎ 21:34 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 並べ替えを使えばできるのですが、SUMIIFやRANK関数などを使って簡単にできる方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数で、と考えたのですが、この問題は多分手強いです(注)。 ユーザー関数を作って対処してみました。 ツール-マクロ-VBEの画面のマクロで、挿入-標準モジュールをクリックして、白紙の画面が出るので、下記を 貼りつける。 Function rnk3(a, b, c) Dim x(3) x(1) = 0: x(2) = 0: x(3) = 0 n = 0 Dim cl As Range d = c.Column - b.Column For Each cl In b If cl = a Then n = n + 1 y = cl.Offset(0, d) Select Case y Case Is > x(1) x(3) = x(2) x(2) = x(1) x(1) = y Case Is > x(2) x(3) = x(2) x(2) = y Case Is > x(3) x(3) = y Case Else End Select End If Next '--- If n > 2 Then rnk3 = (x(1) + x(2) + x(3)) / 3 Else rnk3 = (x(1) + x(2) + x(3)) / n End If End Function これは出場選手3人以上の場合上位3人で平均、2,1名の時は2,1名の平均値を返します。 (例データ)質問では時間だが、整数数字に変えてテストデータとした。 名前 チーム 数量 上位3人平均 名前1 a 1 2.666666667 名前2 b 2 6 名前3 a 3 2.666666667 名前4 a 4 2.666666667 名前5 b 5 6 名前6 b 6 6 名前7 b 7 6 名前8 c 8 9.333333333 名前9 c 9 9.333333333 名前10 d 10 11.66666667 名前11 c 11 9.333333333 名前12 d 12 11.66666667 名前13 d 13 11.66666667 D1に=rnk3(B1,$B$1:$B$13,C1) D2以下に複写する。 結果上記(上位3人平均)の通り。 これでは重複があって、良く判らないので チーム名(上記ではa,b,c,d)をG1:G4に別途セットする a 2.666666667 4 b 6 3 c 9.333333333 2 d 11.66666667 1 H1に=rnk3(G1,$B$1:$B$13,C1) といれH4まで式を複写する。 結果は上記の通り。 これに基づいて、ランク関数を使う。 =RANK(H1,$H$1:$H$4) H4まで複写。 (注)配列数式になると思って、試行錯誤しましたが Rank関数を使う時の第2引数の「範囲」を、配列に入れることが出来ないようで、断念しました。
その他の回答 (2)
- big_fool
- ベストアンサー率22% (43/193)
たとえばE列にタイムのランクを出しておく =RANK(D2,$D$2:$D$11,1)を必要行までドラック このランクを元にF列に1 2 3 と入力しておき G行に =INDEX($A$2:$D$11,MATCH($F2,$E$2:$E$11,0),2) H行に =INDEX($A$2:$D$11,MATCH($F2,$E$2:$E$11,0),3) I行に =INDEX($A$2:$D$11,MATCH($F2,$E$2:$E$11,0),4) を2行から4行までドラック 後でE列を非表示にする こんな感じでは・・・
お礼
回答がおそくなりました。 シンプルなやり方で気に入りました。 参考になりました。 その後の処理で、3人以上選手がいるチームの中からチームごとに上位3人の記録を抜き出すことができませんでした。何か良い方法があれば教えてください。
- SAKURAMYLOVE
- ベストアンサー率30% (162/533)
以下の条件で、他のSheetに関数で並び替えを行います。 【条件】 (1)Sheet1にデータが2行から11行まで入っているものとします。 (2)タイムに同じ値はないものとします。 【手順】 (1)データの入っている(Sheet1)A列に新しい列を挿入し、データを右側に1列ずらします。 (2)挿入した列のA2以下、以下の関数を入力し、11行までコピーします。 =RANK(E2,$E$2:$E$11) (3)書き出すシートに以下の項目名を作成します。 A列 B列 C列 D列 E列 順位 番号 名前 チーム名 タイム A列には、2行目から1,2,3,・・・と連番を振ります。 (4)B2~E2まで以下の関数を入力し、下の行へコピーします。 B2=VLOOKUP(Sheet2!$A2,Sheet1!$A$2:$E$11,2,0) C2=VLOOKUP(Sheet2!$A2,Sheet1!$A$2:$E$11,3,0) D2=VLOOKUP(Sheet2!$A2,Sheet1!$A$2:$E$11,4,0) E2=VLOOKUP(Sheet2!$A2,Sheet1!$A$2:$E$11,5,0) もし、同じ値がある場合には、ちょっと工夫が必要ですが、とりあえず、これで並び替えができます。
お礼
回答がおそくなりました。 こんな並び替えの方法もあるんですね。 参考になりました。 その後の処理で、3人以上選手がいるチームの中からチームごとに上位3人の記録を抜き出すことができませんでした。何か良い方法があれば教えてください。
お礼
ありがとうございました。 こんなに難しい問題だったんですね。 教えてもらったユーザー関数でやってみました。 これを参考にチャレンジしてみます。