「これはヤバかったな」という遅刻エピソード

Excel2000を使用しております。
関数を使用して下記内容の結果を求めるにはどうすればよいの
ですか?

結果1 → 科目1の順位(関数 RANKを使用してできました)
結果2 → 性別が1での科目1の順位 
結果3 → 性別が1、科目2が10以上での科目1の順位

得点が同じ場合は同順位となる。

連番、性別、科目1、科目2、結果1、結果2、結果3
1   1   56   10    1    1    1
2   1   37   9     3    3
3   2   -    10
4   2   37    7    3
5   1   50   10     2    2    2

あくまでも関数で処理したいのですが?

A 回答 (3件)

 【方法その1】関数と作業列を使う方法


 今仮に、「連番」と入力されているセルが、Sheet1のA1セルであるものとします。
 まず、適当な使用していないシート(ここでは仮にSheet2とします)のA2セルに、次の数式を入力して下さい。

=IF(AND(ISNUMBER(INDEX(Sheet1!$C:$C,ROW())),INDEX(Sheet1!$B:$B,ROW())=1),INDEX(Sheet1!$C:$C,ROW()),"")

 次に、Sheet2のB2セルに、次の数式を入力して下さい。

=IF(AND(ISNUMBER(INDEX(Sheet1!$C:$C,ROW())),INDEX(Sheet1!$B:$B,ROW())=1,ISNUMBER(INDEX(Sheet1!$D:$D,ROW())),INDEX(Sheet1!$D:$D,ROW())>=10),INDEX(Sheet1!$C:$C,ROW()),"")

 次に、Sheet2のA2~B2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。

 次に、Sheet1のF2セルに、次の数式を入力して下さい。

=IF(ISNUMBER(INDEX(Sheet2!$A:$A,ROW())),RANK(INDEX(Sheet2!$A:$A,ROW()),Sheet2!$A:$A),"")

 次に、Sheet1のG2セルに、次の数式を入力して下さい。

=IF(ISNUMBER(INDEX(Sheet2!$B:$B,ROW())),RANK(INDEX(Sheet2!$B:$B,ROW()),Sheet2!$B:$B),"")

 次に、Sheet2のF2~G2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。

 以上です。


 【方法その2】作業列を使用せず、関数のみで処理を行う方法(但し、表の行数が、数千行以上もある場合には、計算処理に要する負荷が大きくなります)
 今仮に、「連番」と入力されているセルがA1セルであるものとします。
 まず、F2セルに、次の数式を入力して下さい。

=IF(AND(ISNUMBER(INDEX($C:$C,ROW())),INDEX($B:$B,ROW())=1),SUMPRODUCT(ISNUMBER($C$1:INDEX($C:$C,MATCH(MAX($C:$C)+1,$C:$C)))*($B$1:INDEX($B:$B,MATCH(MAX($C:$C)+1,$C:$C))=1)*($C$1:INDEX($C:$C,MATCH(MAX($C:$C)+1,$C:$C))>=INDEX($C:$C,ROW()))),"")

 次に、G2セルに、次の数式を入力して下さい。

=IF(AND(ISNUMBER(INDEX($C:$C,ROW())),INDEX($B:$B,ROW())=1,ISNUMBER(INDEX($D:$D,ROW())),INDEX($D:$D,ROW())>=10),SUMPRODUCT(ISNUMBER($C$1:INDEX($C:$C,MATCH(MAX($C:$C)+1,$C:$C)))*($B$1:INDEX($B:$B,MATCH(MAX($C:$C)+1,$C:$C))=1)*ISNUMBER($D$1:INDEX($D:$D,MATCH(MAX($C:$C)+1,$C:$C)))*($D$1:INDEX($D:$D,MATCH(MAX($C:$C)+1,$C:$C))>=10)*($C$1:INDEX($C:$C,MATCH(MAX($C:$C)+1,$C:$C))>=INDEX($C:$C,ROW()))),"")

 次に、F2~G2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。

 以上です。
「Excel関数で順位」の回答画像2
    • good
    • 0
この回答へのお礼

早々にありがとうございます。
思いの通りの結果ができました。
失礼ながら「すばらしい」と言わせて下さい。

お礼日時:2011/10/25 15:30

No.1です。



作業列を使いたくないのであれば
F2に
=IF(B2=1,SUMPRODUCT(($B$2:$B$6=1)*($C$2:$C$6>C2))+1,"")
G2に
=IF(AND(B2=1,D2>=10),SUMPRODUCT(($B$2:$B$6=1)*($D$2:$D$6>=10)*($C$2:$C$6>C2))+1,"")
と入力して下方向に複写で可能かと思います。

No.2さんの【方法その2】だと、同点で1位が2人いた場合、2人とも2位になります。

    • good
    • 0
この回答へのお礼

ありがとうございます。ご指摘の通りです。
これから色々なデータで確認いたします。
このアドバイスはとても参考になりました。

お礼日時:2011/10/25 18:00

空いている列を作業列として使うのが簡単だと思います。



例えばH列に

=IF(B2=1,C2,"")

I列に

=IF(AND(B2=1,D2>=10),C2,"")

という式を入れると、H列は結果2、I列は結果3の条件に合致する行だけ
同じ行のC列の値(=科目1の点数)が入るはずです。

このH列、I列の値に対してRANK関数を使えばいいです。
ちなみにH列やI列に""が入っている行はRANK関数を普通に使うと#VALUE!エラーを返します。

=IF(H2<>"",RANK(H2,H:H),"")

このような形でエラー回避をしてください。

作業列が見栄え的に邪魔であれば、列自体を非表示にすればいいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはり、分解するしかないのですか・・・・・
でも、確実ですね。

お礼日時:2011/10/25 15:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報