- ベストアンサー
ランキング表の作成について
EXCELで、一ヶ月ごとの障害の種類をランキング表として作成したいと考えております。 どのように作ればよろしいでしょうか? データ 日付 障害の種類 2011/1/12 AAA 2011/1/13 AAB 2011/1/14 BBB 2011/1/15 AAA 2011/1/16 AAA 2011/1/16 BBB 2011/1/17 AAA ランキング表 1位 AAA 3件 2位 BBB 2件 3位 AAB 1件
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
→まずピボットテーブルをつかい障害の種類についてデータの個数を調べる →rank関数で順位をつける →あとは必要ならソートする
その他の回答 (3)
- KURUMITO
- ベストアンサー率42% (1835/4283)
年や月が変わっても対応できる方法です。お示しの元のデータはシート1のA1セルに日付、B1セルに症外の種類とそれぞれ文字列が有り下方にデータが入力されているとします。なお、A列でのデータは昇順で並べられているとします。古い日付のデータはより上の行にあるとします。 そこでシート1では作業列を用意します。 C2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",DATE(YEAR(A2),MONTH(A2),1)&B2) D1セルには次の式を入力します。 =LEFT(C2,5)*1000 D2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(COUNTIF(C$2:C2,C2)=1,LEFT(C2,5)*1000+COUNTIF(C:C,C2)-ROW()/10000,"") E2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(D2="","",LEFT(D2,5)*1000+RANK(D2,INDEX(D:D,MATCH(LEFT(D2,5)*1000,D:D,1)):INDEX(D:D,MATCH((LEFT(D2,5)+1)*1000,D:D,1)))) シート2にはお求めの表を例えばシート2のA1セルに西暦年を入力することでその年の1月から12月のそれぞれの月における障害ランキングを1位から9位まで表示させることができるようにします。勿論、同じ件数の障害が有れば同じ順位が表示されるようにします。 シート2ではつぎのようにします。 A1セルには2011や2010のように西暦年を入力します。 B1セルには 年ランキング表 とでも入力します。 A2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ROW(A1)>120,"",IF(MOD(ROW(A1),10)=1,INT((ROW(A1)-1)/10)+1,IF(AND(MOD(ROW(A1)-1,10)<10,MOD(ROW(A1)-1,10)>0,C2<>""),RANK(C2,INDEX(C:C,(INT((ROW(A1)-1)/10)+1)*10-8):INDEX(C:C,(INT((ROW(A1)-1)/10)+1)*10+1))&"位",""))) B2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(AND(ROW(A1)<120,MOD(ROW(A1),10)=1),"月",IF(AND(MOD(ROW(A1)-1,10)<10,MOD(ROW(A1)-1,10)>0),IFERROR(INDEX(Sheet1!$B:$B,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0)),""),"")) C2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(OR(MOD(ROW(A1),10)=1,MOD(ROW(A1),10)=0),"",IFERROR(MOD(INT(INDEX(Sheet1!$D:$D,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0))),1000)+1,"")) IFERROR関数はエクセル2010などでは有効ですが古いバージョンでは使うことができません。 B2セルには次の式を入力します。 =IF(AND(ROW(A1)<120,MOD(ROW(A1),10)=1),"月",IF(AND(MOD(ROW(A1)-1,10)<10,MOD(ROW(A1)-1,10)>0),IF(ISERROR(INDEX(Sheet1!$B:$B,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0))),"",INDEX(Sheet1!$B:$B,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0))))) C2セルには次の式を入力します。 =IF(OR(MOD(ROW(A1),10)=1,MOD(ROW(A1),10)=0),"",IF(ISERROR(MOD(INT(INDEX(Sheet1!$D:$D,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0))),1000)+1),"",MOD(INT(INDEX(Sheet1!$D:$D,MATCH(DATE($A$1,INT((ROW(A1)-1)/10)+1,1)*1000+MOD(ROW(A1)-1,10),Sheet1!$E:$E,0))),1000)+1))
- kagakusuki
- ベストアンサー率51% (2610/5101)
元データの表には、異なる月のデータは入力されていない場合には、次の様な方法で、自動的にランキング表を表示させる事が出来ます。 今仮に、元データの表中で、「2011/1/12」と入力されているのがSheet1のA2セルであり、ランキング表で、「1位」と入力されているのがSheet2のA2セルであるものとします。 又、Sheet3のA列とB列を作業列として使用するものとします。 まず、Sheet3のA2セルに次の数式を入力して下さい。 =IF(COUNTIF(Sheet1!$B$1:INDEX(Sheet1!$B:$B,ROW()),INDEX(Sheet1!$B:$B,ROW()))=1,COUNTIF(Sheet1!$B:$B,INDEX(Sheet1!$B:$B,ROW())),"") 次に、Sheet3のB2セルに次の数式を入力して下さい。 =IF(ISNUMBER($A2),RANK($A2,$A:$A)+COUNTIF($A$1:$A2,$A2)/COUNTIF($A:$A,$A2),"") 次に、Sheet3のA2~B2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 次に、Sheet2のA2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet3!$A:$A),"",RANK(LARGE(Sheet3!$A:$A,ROWS($2:2)),Sheet3!$A:$A)&"位") 次に、Sheet2のB2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$B:$B,MATCH(SMALL(Sheet3!$B:$B,ROWS($2:2)),Sheet3!$B:$B,0))) 次に、Sheet2のC2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet3!$A:$A),"",LARGE(Sheet3!$A:$A,ROWS($2:2))&"件") 次に、Sheet2のA2~C2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 これで、ランキング表が自動的に作成されます。
- LHS07
- ベストアンサー率22% (510/2221)
いきなり多い順に並べることは無理です。 1.とりあえず、AAAの数を数えます。 データがB2からB10まで入っているとします。 A13 に AAAを入力 A14 に BBBを入力 A15 に AABを入力 B13に =COUNTIF($B$3:$B$10,A13) を入力します。 B14、B15はずずずっとやります。 B14 =COUNTIF($B$3:$B$10,A14) B15 =COUNTIF($B$3:$B$10,A15) となりますね。 2.多い順位並べる A13からB15選択ー>右クリックー>コピー D21を選択ー>形式を選択して貼り付けー>値ー> ESCキー D21からE23まで選択ー>データーー> 列E 降順 ー>OK 以上 操作は以上です。何回もやって慣れてください。
お礼
サンプルまで作ってくれて、ありがとうございます。 ただAAAなどの障害の種類は、数が決まっているわけではなく、新しい障害の種類が増えれば増えますので、このやり方は参考までとさせていただきます。
お礼
ありがとうございます。 ピボットテーブルですか。結構、使えそうですね。