- ベストアンサー
エクセル、同じ数字が入らない。
よろしくお願いします Sランク=100 Aランク>90 Bランク>70 Cランク=<70 のIF関数 Aさん 80 90 A 3番 Bさん 20 100 S 1番 Cさん 30 90 A 4番 Dさん 40 100 S 2番 Eさん 50 90 A 5番 Sは1名 Aは2名 Bは10名としたいのですが Aさん 90 A 3番 Bさん 100 S 1番 Cさん 90 B 4番 Dさん 100 A 2番 Eさん 90 B 5番 どのようにしたらいいか分かりません。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
C列が得点?として計算しています。 上の方は ランク=IF(C1=100,"S",IF(C1>90,"A",IF(C1>70,"B","C"))) ただし90はBランクですね。 順位=SUMPRODUCT(($C$1:$C$100+1-ROW($C$1:$C$100)/100>C1+1-ROW()/100)*1)+1 (範囲は使用している物に合わせてください。) 下の方は 順位は上と同じで ランク=MID("SAABBBBBBBBBBC",MIN(順位,14),1) 順位でランクを振り分ける。
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
#5です。関数を使ってやって見ました。作業列(C列)を1列使います。 (サンプルデータ)A1:D13 (A列)(B列) (C列) (D列) Aさん 90 90.1 B Bさん 100 100.1 A Cさん 90 90.2 B Dさん 100 100.2 S Eさん 90 90.3 B Fさん 95 95.1 A Gさん 60 60.1 B Hさん 70 70.1 B Iさん 80 80.1 B Jさん 75 75.1 B Lさん 65 65.1 B Kさん 85 85.1 B Mさん 72 72.1 B (VLOOKUP用の表) E1:F3 0 S 2 A 4 B 4以上(4,5、・・13)はB、2以上(2,3)はA、0以上(1)はSを意味している表です。 段階から値を求める、VLOOKUP関数のTRUE型で使う表です。 (関数式) C1に=B1+COUNTIF($B$1:$B1,B1)/10と入れる。 同じ点数は9人以下であると仮定し、わざと同点を違う 小数点付きの数値を与えている。 C1をC2以下の下方向に複写する。 D1に=VLOOKUP(RANK(C1,$C$1:$C$13),$E$1:$F$3,2,TRUE)といれ、下方向に 複写する。 (結果) 結果は上記D列の通りになる。 B列は、正整数のデータであると仮定が必要。
- imogasi
- ベストアンサー率27% (4737/17069)
普通の関数式では複雑にならざるを得ないようです。 そこでユーザー関数を作ってみました。 (データ)A1:B13に (A列)(B列) (C列)=関数式の結果 Aさん 90 B Bさん 100 A Cさん 90 B Dさん 100 S Eさん 90 B Fさん 95 A Gさん 60 B Hさん 70 B Iさん 80 B Jさん 75 B Lさん 65 B Kさん 85 B Mさん 72 B (関数式) C1に=rankx($B$1:$B$13,B1,1,2,10)と入れる。 絶対番地部分に注意。 C2からC13まで複写する。 結果は上記の通り。 同点の場合どちらが上ランクになるかは、問わない。 (コード) Function rankx(a, b, n1, n2, n3) Dim d(1000), r(1000) rw = b.Row Dim cl As Range i = 0 For Each cl In a i = i + 1 d(i) = cl r(i) = i Next For j = 1 To i For k = j To i If d(j) > d(k) Then GoTo p01 w = d(j) d(j) = d(k) d(k) = w w = r(j) r(j) = r(k) r(k) = w p01: Next k Next j For k = 1 To i If r(k) = rw Then Select Case k Case Is <= n1 rankx = "S" Case Is <= n1 + n2 rankx = "A" Case Else rankx = "B" End Select End If Next k End Function 上記を ツール-マクロ-VBEで出る画面において メニュの挿入ー標準モジュールで出る画面に先に、上記をコピーして、貼りつけておくこと。 やっていることは、指定列データを大ー>小の順に並べて 順位をつけて、指定した人数分の区切りで順に、S、A、Bを振っている。この点ではやっていることは常識的に思いつくことかと。
- s_yoshi_6
- ベストアンサー率73% (1113/1519)
もし同じ点数の場合、リストの上の方にある人が上位になる、ということでよければ、点数からそのセルの行番号に応じた十分小さい数(例えばエクセルの行数の最大値は65536なので、小数第1位を四捨五入しても1にならない程度で「行番号÷1000000」とか。ただし点数が小数もありうるのであれば、もっと小さくしなければなりません)を点数から引いてやって、その順番を使うという方法ではいかがでしょうか。 A列から右に、名前、点数、作業列、ランク、順番(質問に書かれていますので、順番の列も作成するものとします)として2行目から21行目まで入力していくものとします。 C2に =B2-ROW()/100000 D2に =IF(OR(B2="",B2<0,B2>100),"",IF(AND(B2=100,E2=1),"A",IF(AND(B2>90,E2<=3),"B",IF(AND(B2>70,E2<=13),"C","D")))) E2に =RANK(C2,$C$2:$C$21) かつ 右クリック→セルの書式設定で、ユーザー定義の種類に「0"番"」と入力 として以下コピーとします。 C列は列の非表示で隠すか、もしB列の点数が直接入力でなく、どこか別のセルの参照であって、かつ点数の数値を他の計算に使われないのであれば、参照セル(B2)をそのセルに代えてC列をそのまま点数欄にされてもよいと思います。(セルの書式は「数値」の小数点以下の桁数を0とするなどすれば、問題ないと思います) またE列(順番の列)を実際には作成しないのであれば、D2の式のE2のところに RANK(C2,$C$2:$C$21)を代入して、 =IF(OR(B2="",B2<0,B2>100),"",IF(AND(B2=100,RANK(C2,$C$2:$C$21)=1),"A",IF(AND(B2>90,RANK(C2,$C$2:$C$21)<=3),"B",IF(AND(B2>70,RANK(C2,$C$2:$C$21)<=13),"C","D")))) とされるとよいと思います。 P.S. 質問の Aさん 80 90 A 3番 Bさん 20 100 S 1番 Cさん 30 90 A 4番 Dさん 40 100 S 2番 Eさん 50 90 A 5番 は Aさん 90 A 3番 Bさん 100 S 1番 Cさん 90 A 3番 Dさん 100 S 1番 Eさん 90 A 3番 のことではないかと解釈して回答しました。
- hinebot
- ベストアンサー率37% (1123/2963)
まず、 Aさん 80 90 A 3番 Bさん 20 100 S 1番 Cさん 30 90 A 4番 Dさん 40 100 S 2番 Eさん 50 90 A 5番 左から2列目の数字(80,20,30,40,50)の意味を説明してください。 最後の順位付けの法則(基準)がわかりません。 補足お願いします。
補足
申し訳ないです・ 80.20.30.40.50はコードナンバーです。 順位は90、100、90、100、90で 同じ数字に関しては、上から順番ずつとしてあります。 説明不足で申し訳ありません。。
- peugeot307
- ベストアンサー率22% (29/130)
100点(?)でも2番だとAってことですか? 順番は先に振ってあるなら、Sの条件を 点数=100点 and 順番=1番でどうでしょう? もし順番を後から振るとしたら・・・ 同じ100点の人の順位はどうやって決めるのですか?
お礼
すばらしくできちゃいました^^ ありがとうございました。。