• 締切済み

エクセルで順位付けする方法を教えて下さい

エクセルで順位付けする方法を教えて下さい。 (A列)にクラス、(B列)に学籍番号、(C列)に得点が記載された1つの表があるとします。表にはクラス、学籍番号、得点、順に並んでいないところを、関数で順位付けしたいと考えています。表示結果として、クラス毎で得点の低い順に表示したいと考えています。 具体的には、 元々の表 (A列) (B列) (C列)  A組   8   57  B組   4   41  A組   6   42  C組   3   83  C組   6   73  B組   2   83 結果の表 (A列) (B列) (C列)  A組   6   42  A組   8   57  B組   4   41  B組   2   83  C組   6   73  C組   3   83 非常に煩雑な関数になりそうですが、お力をお貸しいただきたく宜しくお願いいたします。        

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.14

追記。 A 8 57 → A 6 42 1 B 4 41 → A 8 57 2 A 6 42 → B 4 41 1 C 3 83 → B 2 83 2 C 6 73 → B 2 83 2 B 2 83 → B 3 83 2 B 2 83 → C 6 73 1 B 3 83 → C 3 83 2 提示分ですが、 一応確認として、 万が一、入力誤りがあって 同じクラス、番号、点の重複データがあったとしても対応してました。 ここの回答例をベースにして、今回の対応が終わるとして、 以後ちょっと条件が変わっても保守できるのか、と いうのが気になります。 他の用途でも順番付け(グループごとに並べ替え、連番を振る)というのは よくある話なので、活用できたらと思います。 今回使われている関数、VBAを学習しておくことをお勧めします。

全文を見る
すると、全ての回答が全文表示されます。
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.13

◆Sheet2の式 A1=INDEX(Sheet1!A:A,MATCH(SMALL(INDEX((CODE(Sheet1!$A$1:$A$6)&TEXT(Sheet1!$C$1:$C$6,"000")&TEXT(Sheet1!$B$1:$B$6,"000"))*1,),ROW(A1)),INDEX((CODE(Sheet1!$A$1:$A$6)&TEXT(Sheet1!$C$1:$C$6,"000")&TEXT(Sheet1!$B$1:$B$6,"000"))*1,),0)) ★右と下にコピー

全文を見る
すると、全ての回答が全文表示されます。
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.12

関数でということでしたら計算が重くならずに対応するためには作業列を設けて行うことでしょう。 シート1にお示しのデータがあるとしてD1セルには次の式を入力して下方いオートフィルドラッグします。 =IF(A1="","",CODE(A1)*1000+C1) シート2にはお求めの表を表示させるとしてA1セルには次の式を入力してC1セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>COUNTA(Sheet1!$A:$A),"",INDEX(Sheet1!$A:$C,MATCH(SMALL(Sheet1!$D:$D,ROW(A1)),Sheet1!$D:$D,0),COLUMN(A1))) 同じクラスで同じ点数がある場合でも対応できます。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.11

Sub RANKING() Dim I As Long Dim J As Long Dim K As Long Dim M As Long '算出行数 Dim XX As String Dim YY As String Dim ZZ As String Dim X(10) As String 'A列 Dim Y(10) As String 'B列 Dim Z(10) As String 'C列 Dim R(10) As String '順位 Range("A1").Select M = 0 'とりあえず10行までループ、値があるものはワークへ退避 For I = 1 To 10 If Len(Cells(I, 1)) > 0 Then M = M + 1 X(M) = Cells(I, 1) Y(M) = Cells(I, 2) Z(M) = Cells(I, 3) R(M) = 0 End If Next I 'ワークへ退避したものを並べ替え(A列違えば相互入替、C列違えば相互入替) For I = 1 To M - 1 For J = I + 1 To M If X(I) > X(J) Then XX = X(J) X(J) = X(I) X(I) = XX YY = Y(J) Y(J) = Y(I) Y(I) = YY ZZ = Z(J) Z(J) = Z(I) Z(I) = ZZ Else If X(I) < X(J) Then Else If Z(I) > Z(J) Then XX = X(J) X(J) = X(I) X(I) = XX YY = Y(J) Y(J) = Y(I) Y(I) = YY ZZ = Z(J) Z(J) = Z(I) Z(I) = ZZ End If End If End If Next J Next I '並べ替えしたものに順位付け K = 1 R(1) = 1 For I = 1 To M If X(I - 1) <> X(I) Then K = 1 Else If Z(I - 1) <> Z(I) Then K = K + 1 End If End If R(I) = K Next I '順位付けしたものをセルへ貼り付け For I = 1 To M Cells(I, 5).Value = X(I) Cells(I, 6).Value = Y(I) Cells(I, 7).Value = Z(I) Cells(I, 8).Value = R(I) Next I MsgBox ("終了") End Sub ざっと作成してみたので参考。 あとはデバッグして調整してください

全文を見る
すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.10

 万が一、他のクラスに同じ得点の人がいる場合、特に別クラスで学籍番号と得点が共に同じ人がいる場合にも対応する方法です。  今仮に、クラスがA組からJ組までの10クラスまであるものとします。  又、元々の表はSheet1に存在し、結果の表はSheet2に作成し、Sheet3のA列を作業列として使用するものとします。  まず、Sheet3のA1セルに、次の数式を入力して下さい。 =IF(ROW(1:1)>MATCH(9^9,Sheet1!$C:$C),"",Sheet1!$C1+(MATCH(Sheet1!$A1,{"A組","B組","C組","D組","E組","F組","G組","H組","I組","J組"},0)+Sheet1!$B1/MAX(Sheet1!$B:$B))/10)  尚、この数式中の"A組","B組","C組","D組","E組","F組","G組","H組","I組","J組"の部分は、実際のクラス名に合わせて、適時修正して下さい。  又、クラスの総数が10クラスを超えている場合には、数式の末尾にある /10) の部分の10を、クラス数に等しい数に変更して下さい。(クラス数の方が少ない分には問題ありません)  次に、Sheet3のA1セルをコピーして、A2以下に貼り付けて下さい。  次に、Sheet2のA1セルに、次の数式を入力して下さい。 =IF(ROW(1:1)>COUNT(Sheet1!$C:$C),"",INDEX(Sheet1!A:A,MATCH(SMALL(Sheet3!$A:$A,ROW(1:1)),Sheet3!$A:$A,0)))  次に、Sheet2のA1セルをコピーして、B1セルとC1セルに貼り付けて下さい。  次に、Sheet2のA1~C1の範囲をコピーして、同じ列の2行目以下に貼り付けて下さい。  以上です。

全文を見る
すると、全ての回答が全文表示されます。
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.9

私の回答で同じ組に同点の人がいた場合に対応するなら、複雑な数式になりますが以下のような数式をF2セルに入力してください。 =IF(E2="","",INDEX(B:B,LARGE(INDEX(($A$2:$A$10=E2)*($C$2:$C$10=G2)*ROW($A$2:$A$10),),IF(SUMPRODUCT(($A$2:$A$10=E2)*($C$2:$C$10=G2))=1,1,SUMPRODUCT(($A$2:$A$10=E2)*($C$2:$C$10=G2))+1-COUNTIF($E$2:E2,E2))))) ちなみに上記の数式はE列とG列の値を参照していますので、G列の点数データが表示されていないと(数式を入力しないと)正しい値を表示しません。

全文を見る
すると、全ての回答が全文表示されます。
回答No.8

#3、#7です。同一シートで、遊びの配列数式。 =IF(COUNT(B:B)<ROW(A1),"", INDEX(A$2:A$7,MATCH(SMALL(CODE($A$2:$A$7)*100000-$C$2:$C$7*100+$B$2:$B$7,ROW(A1)), CODE($A$2:$A$7)*100000-$C$2:$C$7*100+$B$2:$B$7,0))) [Ctrl]+[Shift] +[Enter] で確定({}で囲まれる) 右へ下へオートフィル 切り取り 別シートへ貼り付け 先の回答の応用にはなるのですが、お遊びなので解説しません。 失礼しました。m(_ _"m)ペコリ

全文を見る
すると、全ての回答が全文表示されます。
回答No.7

#3です MackyNo1 さんの回答を参考にさせて頂いていたところ 重複の問題に気づかされました。もう一度書き直します 作業列を使って丁寧に作っていくとして D2セル クラス、点数、番号を順位に組み込む =CODE(A2)*100000-C2*100+B2 下へオートフィル E2セル 順番を出す =RANK(D2,$D$2:$D$7,1) 下へオートフィル G2セル 単に連番 H2セル 位置を探す =MATCH($G2,$E$2:$E$7,0) 下へオートフィル I2セル 値を返す =INDEX(A$2:A$7,$H2) 下へ右へオートフィル

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.5です! たびたびごめんなさい。 前回の投稿でSheet2の数式が間違っていました。 Sheet2のA2セルは =IF(COUNT(Sheet1!$E:$E)<ROW(A1),"",INDEX(Sheet1!A$2:A$1000,MATCH(ROW(A1),Sheet1!$E$2:$E$1000,0))) に訂正してください。 前回の式だと1行ずれてしまいます。 何度も失礼しました。m(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんばんは! 単純にRANK関数で対応できると思いますが、万一同じクラス内に同点の人がいた場合に対応できるようにしてみました。 ↓の画像のように作業用の列を2列設けています。 そして、Sheet1に別表(G・H列)を作ってみました。これは単純にクラスを小さい順に並べるための表です。 Sheet1の作業列1D2セルに =IF(A2="","",VLOOKUP(A2,$G$2:$H$5,2,0)+RANK(C2,C:C,1)) 作業列2のE2セルに =IF(D2="","",COUNTIF(D:D,"<"&D2)+COUNTIF($D$2:D2,D2)) という数式を入れ、C2・D2セルを範囲指定しD2セルのフィルハンドルで下へオートフィルでずぃ~~~!っとコピーします。 そして結果のSheet2のA2セルに =IF(COUNT(Sheet1!$E:$E)<ROW(A2),"",INDEX(Sheet1!A$2:A$1000,MATCH(ROW(A2),Sheet1!$E$2:$E$1000,0))) という数式を入れ、列方向と行方向にオートフィルでコピーすると 画像のような感じになります。 これで同じクラスに同点(同順位)の人がいてもちゃんと表示されると思います。 尚、同点の場合は上側の行の順位が先に表示されます。 以上、参考になれば良いのですが・・・m(__)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルでの順位付け

    エクセルでの順位付けについて教えて下さい。 下記のような順位付けをしたいのですがどのような操作をしたらよいでしょうか。 A 30    1 D 50 B 10  → 2 A 30 C 30    2 C 30 D 50    4 B 10 (得点の多い方から1,2,3・・とし、同点の場合は同順位として次の順位を空位にする)

  • エクセルで順位付け

    お世話になります。宜しくお願いします。 RANK関数で同順位が出た場合に、指定した数値(条件)を参照して順位を出す方法をOK Wave等で探しました。私のニーズに一番近い問答が在りましたので(質問者:Kaizu35 質問No:965845さん)、それを引用させて頂きます。 A列  B列  C列  D列 No1   0.83   1   1 No2   1.29 4 6 No3   1.01 3 4 No4   0.88 2 2 No5   1.01 3 5 No6   0.88 2 3 上の表の様にRANK関数を使うとC列の様な順位になります。それをD列の様な順位にしたいのです。条件として、A列のNo1~No6の通り若い数字順、(例えば、No4の0.88が2位でNo6の0.88が3位とか、No3の1.01が4位でNo5の1.01が5位)の用に同じ0.88でも1.01でもNo4とNo6、No3とNo5ではNo4とNo3の方が若い数字なので、その若い数字の方が順位は上になるようにするには、どのような関数を使えばいいのでしょうか。(上記の説明でご理解戴けるでしょうか?) 当方、エクセル関数を始めたばかりですので、なるべく解りやすくご教授をお願いします。

  • エクセルでの順位づけ

    こんにちは 下のような表で、C列に順位をつけて、順位を出すのではなく、 名前を表示したい場合(5行目から7行目)は、どうしたらいいのか困っています。 この関数ならできるというのがありましたら、教えてください。 よろしくお願いします。     A列   B列   C列     (名前) (点) (順位) 1行目 いちろう  40    2 2行目 じろう   30    3 3行目 はなこ   50    1 5行目     第1位  はなこ 6行目     第2位  いちろう 7行目     第3位  じろう

  • エクセル関数の順位つけで教えてください

    順位つけで10行全部に関数を入れておき AとBに時間を入れた場合に、入れたところだけD列に 1から順位がつくようにする関数を 教えてください。

  • 順位付け

       A  B  C  D  E 1  A  6  5  2  3  2  B  3  4  1  1 3  C  9  5  3  5 4  D  6  4  2  1 5  D  0  4  0  -4 A列、チ-ム名 B列、勝点 C列試合数 D列、勝数 E列、得失点差 このようなシ-トがある場合、別のセルに1位~5位までの順位付けする関数を教えてください。 尚、勝点が同点場合は得失点差を考慮します。

  • エクセルで同率の順位の人が表示されない

    得点表を元に順位(RANK関数)を出し名前順の表にして、 その順位表を元にVLOOKUP関数で順位順の表を作ってます。 この場合、順位順の表では同順位の人がいた場合、同順位2人目以降の人の名前が表示されません(#N/Aと表示されます) 同位の人も名前と得点をそのまま表示させたいのですが、何か方法は有りませんか? 現在↓ 1位 Aさん 10点 2位 Bさん  9点 3位  #N/A  #N/A 4位 Dさん  8点     ・     ・ となります。それを 1位 Aさん 10点 2位 Bさん  9点 3位 Cさん  9点 4位 Dさん  8点 としたいです。 左の順位表記は書きこんでいるだけなので変化しません。もちろん順位に連動して変化してほしいですが、このままでも構いません。 Aさん・Bさんの各セルに=VLOOKUP(Q5,$U$4:$V$21,2,FALSE)のように設定しています。 ずいぶん前に本を見ながら設定したもので、理屈は忘れてます・・エクセル2000です。

  • エクセル 一連のデータを任意の範囲で順位付けしたい

    エクセルで、一つの列に並べられたデータを、任意の範囲で順位付けがしたいです。 具体的に説明します。 下記の表のように、A列に任意の文字、B列に数字があります。 A列   B列 AAA   15 AAA   19 BBB   3 BBB   8 BBB   9 BBB   4 BBB   1 DDD   20 DDD   21 DDD   19 この中で、A列の文字が同じものについて、B列の数字の順位をC列に表現したいです。理想の結果としては、下記の表になります。 ランク関数を使えばよいのは分かりますが、任意の範囲を指定する方法が分からなく、かつデータ量が膨大(10000行程度)であるため、悩んでいます。よろしくお願いします! A列   B列   C列 AAA   15   2 AAA   19   1 BBB   3    4 BBB   8     2 BBB   9     1 BBB   4     3 BBB   1     5 DDD   20   2 DDD   21   1 DDD   19   3

  • Rank付けについて

    エクセルでRank付け(順位)を考えています。 Rank関数で処理しようと考えたのですが,A列のコード番号が一定ではないため、処理に困っています。場合によってはマクロも考えています. どなたかアドバイス頂けないでしょうか。 A列にコード番号,B列に数値,C列に順位を入れます. 例えば、A2~A4まで1、A5~A6まで2とあり,A2~A4とA5~A6にはそれぞれおなじ数値が入ります。A列コードは3行分だったり2行分だったりと不規則に下に続いていきます。ただし,まとまたコード番号で固まっています. そのA列の同じコード番号全てに対して、B列の値を元にC列に順位を入力したいのです. コード    数値     順位 1       10       3 1       14       1 1       12       2 2       10       2 2       40       1 5       18       3 5       12       2 5       10       1 5       20       4

  • エクセル関数VLOOKUPで教えてください。 

    エクセル関数VLOOKUPで教えてください。  シ-ト1にA列から学籍番号・B列に氏名・C列に点数(数値)を記入してあります。 シ-ト2に順位表を作成しA列にLARGE関数を使用してシ-ト1から点数降順(昇順)に表示しました。シ-ト2のB列に学籍番号 C列に氏名 をVLOOKUP関数でシ-ト1から抽出したいのですが、点数が同点の場合に当該複数名を表示せず単一名になってしまいます。VBA・マクロを使用せずに関数のみで同一点数獲得者の氏名を個別個々に表示させる方法を教えてください。

  • エクセルRANK関数の同率順位を別表に抽出する時

    お世話になります。 エクセル2003を利用しています。初心者なので教えていただきたく存じます。 以下文面のようにランキング表を作りました。 RANK関数を利用してランキングを出し、順位表にTOP5(重複していても)まで出したいと思っています。 A列にA店~Z店までの名前(A店という名前は仮です)が入っており、 B列に上から結果数字がランダムに入力がされており、 C列にRANK関数を使って順位がその結果の横に数字として反映されています。 B列の順位の数字が大体1~20程度までの数字が記入されており、C列のRANK関数の結果が当然ですが重複して順位が表示されている状態です。 別表を作成して1~5位のランキング表を作り、A列に入っている店名とを表示させたいと思っております。 1位と2位は単独であったので店名はINDEXとMATCH関数を使ってきれいに抽出できたのですが、 3位以下は重複しているようで#N/Aと表示されてしまいます。 表示の仕方として「あいうえお順(A~Zの若い順)」で表示できればと思っております。 無知で恐縮なのですが、情報不足の点等あればご指摘いただきたく存じます。 お詳しい方、ご教授宜しくお願い致します。

専門家に質問してみよう