- ベストアンサー
関数でこんなの出来ますか?
ランクとは違うのですが・・ 【例】 5人が競争しました。その結果(勝率)がB列に入っています。 C列にB列の勝率に合わせた点数を入力したいのです。 点数は10ポイント制になります。 A列 B列 C列 青木 8.22 佐藤 7.00 清水 7.11 鈴木 7.67 中村 6.28 こんな計算が出来る関数とかありますか? 知っていましたら教えて下さい。 よろしくお願いします!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
マクロで作ってみました。かなり複雑になってしまいました^^; ややこしそうだと思いますが、コピーして貼り付けるだけなので、以下に書いている手順通りに操作してみてください。 Excelの画面でAlt+F11を押すと、マクロの入力画面が開きます。そこで左側のツリーの「VBAProject(ブック名)」というところを右クリックし、「挿入」>「標準モジュール」を選択すると、「Module1」というのができます。その状態で、右の画面に以下のマクロをコピーして貼り付けてください。 Function GetPoint(AllRatio As Variant, Ratio As Double) As Integer Dim MaxRatio As Double, Rank As Integer, MaxPoint As Integer Dim PrevRank As Integer, PrevRankRatio As Double, PrevPoint As Integer MaxRatio = Application.WorksheetFunction.Max(AllRatio) MaxPoint = IIf(MaxRatio >= 9, 10, 9) Rank = Application.WorksheetFunction.Rank(Ratio, AllRatio) If Rank = 1 Then GetPoint = MaxPoint ElseIf MaxRatio - Ratio <= 0.5 Then GetPoint = MaxPoint - (Ratio - 1) Else PrevRank = GetPrevRank(AllRatio, Rank) PrevRankRatio = GetRatio(AllRatio, PrevRank) PrevPoint = GetPoint(AllRatio, PrevRankRatio) If PrevRankRatio - Ratio <= 0.5 Then GetPoint = PrevPoint - 1 Else GetPoint = PrevPoint - 2 End If End If End Function Function GetPrevRank(AllRatio As Variant, Rank As Integer) As Integer Dim PrevRank As Integer, TmpRank As Integer, i As Integer PrevRank = 1 For i = 1 To AllRatio.Count TmpRank = Application.WorksheetFunction.Rank(AllRatio(i), AllRatio) If TmpRank < Rank And PrevRank < TmpRank Then PrevRank = TmpRank End If Next i GetPrevRank = PrevRank End Function Function GetRatio(AllRatio As Variant, Rank As Integer) As Double Dim i As Integer For i = 1 To AllRatio.Count If Application.WorksheetFunction.Rank(AllRatio(i), AllRatio) = Rank Then GetRatio = AllRatio(i) Exit Function End If Next End Function 貼り付けたらマクロの画面は閉じてかまいません。 エクセルのシートに戻って、 C1に =GetPoint($B$1:$B$5,$B1) と入力し、それを下までコピーすると、各自の点数が表示されます。 正常な値にならない、エラーが出る場合などは補足をお願いします。
その他の回答 (3)
- ham_kamo
- ベストアンサー率55% (659/1197)
条件が思ったよりも複雑でした^^; 関数を組み合わせてやろうといろいろやってみたのですが、ちょっと一筋縄ではいかないようです。 マクロを使ってユーザ定義関数を作ればなんとかできそうです。マクロを使ってもかまいませんか?
補足
はい!すみませんがよろしくお願い致します。 マクロは使った事がないので分からないのですが・・。
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1です。補足拝見しました。 それで、すみません、まだよくわからないので教えてください。 A列 B列 C列 青木 8.22 9 佐藤 7.00 5 清水 7.11 6 鈴木 7.67 8 中村 6.28 3 で、10点満点中、1位の8.22が9となるのは、どういう法則でしょうか。 > 5人のC列に入る点数は勝率の一番高い人が基準で以下の人は基準からの > 差で点数が減っていく感じです。 とありますが、鈴木さんが8で、清水さんが6の理由がわかりません。 基準となる1位の青木さんとの勝率の差をこの表に加えると、 A列 B列 C列 勝率の差 青木 8.22 9 0 佐藤 7.00 5 1.22 清水 7.11 6 1.11 鈴木 7.67 8 0.55 中村 6.28 3 1.94 となりますが、鈴木さんは差が1.0以内なので8、清水さんは差が1.0を超えたから7でなく6、とするのでしょうか。そうすると、中村さんが勝率の差が1.94なのに3というのが、よくわからなくなります。 まとめると、 ・1位の人のポイントを10点満点中の何点にするか、という法則 ・2位以下の人のポイントを求める法則。1位の人との勝率差をどう計算したらポイントになるのか がわからないと、どういう関数を使ってどういう数式にすればいいか、求めることができません。 以上の点の補足をお願いできますか?
補足
お返事おそくなりすみませんでした。 C列のポイントゎ大体で付けてしまいました・・。 法則的には・・ ・1位の人のポイントは勝率9割以上の場合は10(それ以下は9) ・2位以下の人は1位との差が0.5以内なら次点 0.5より上の差がある場合は2ポイント以上の差をつけます。 ・以降順位に従って前の順位の人との差が0.5以内なら次点 0.5より上なら2ポイント差をつけます。 ・まったく同じ勝率でない限り同じポイントはつきません A列 B列 C列 勝率の差 青木 8.22 9 0 佐藤 7.00 4 1.22 清水 7.11 5 1.11 鈴木 7.67 7 0.55 中村 6.28 2 1.94 何度も本当にすみません。 分かる様でしたらよろしくお願い致します。
- ham_kamo
- ベストアンサー率55% (659/1197)
> C列にB列の勝率に合わせた点数を入力したいのです。 > 点数は10ポイント制になります。 というのは、勝率が1位の人が50点、2位の人が40点…、ということでしょうか。それなら、C1に =RANK(B1,B$1:B$5,1)*10 と入力して、下にコピーすればできます。 質問の意図を読み違えていたら、補足をお願いします。(具体的に、上の例ではC列にどういう数字が入るか書いていただけると回答しやすいかと思います)
補足
回答ありがとうございます。 点数とは違くて・・ A列 B列 C列 青木 8.22 9 佐藤 7.00 5 清水 7.11 6 鈴木 7.67 8 中村 6.28 3 みたいな感じで10点制?で付けたいのです。 5人のC列に入る点数は勝率の一番高い人が基準で以下の人は基準からの 差で点数が減っていく感じです。 説明下手ですみません。
お礼
ありがとうございました!無事出来ました。 本当に感謝です。ありがとうございました。