• ベストアンサー

関数でこんなの出来ますか?

ランクとは違うのですが・・ 【例】 5人が競争しました。その結果(勝率)がB列に入っています。 C列にB列の勝率に合わせた点数を入力したいのです。 点数は10ポイント制になります。 A列  B列  C列 青木  8.22 佐藤  7.00 清水  7.11 鈴木  7.67 中村  6.28 こんな計算が出来る関数とかありますか? 知っていましたら教えて下さい。 よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.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) と入力し、それを下までコピーすると、各自の点数が表示されます。 正常な値にならない、エラーが出る場合などは補足をお願いします。

bobby0219
質問者

お礼

ありがとうございました!無事出来ました。 本当に感謝です。ありがとうございました。

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

条件が思ったよりも複雑でした^^; 関数を組み合わせてやろうといろいろやってみたのですが、ちょっと一筋縄ではいかないようです。 マクロを使ってユーザ定義関数を作ればなんとかできそうです。マクロを使ってもかまいませんか?

bobby0219
質問者

補足

はい!すみませんがよろしくお願い致します。 マクロは使った事がないので分からないのですが・・。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

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位の人との勝率差をどう計算したらポイントになるのか がわからないと、どういう関数を使ってどういう数式にすればいいか、求めることができません。 以上の点の補足をお願いできますか?

bobby0219
質問者

補足

お返事おそくなりすみませんでした。 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)
回答No.1

> C列にB列の勝率に合わせた点数を入力したいのです。 > 点数は10ポイント制になります。 というのは、勝率が1位の人が50点、2位の人が40点…、ということでしょうか。それなら、C1に =RANK(B1,B$1:B$5,1)*10 と入力して、下にコピーすればできます。 質問の意図を読み違えていたら、補足をお願いします。(具体的に、上の例ではC列にどういう数字が入るか書いていただけると回答しやすいかと思います)

bobby0219
質問者

補足

回答ありがとうございます。 点数とは違くて・・ A列  B列  C列 青木  8.22   9 佐藤  7.00   5 清水  7.11   6 鈴木  7.67   8 中村  6.28   3 みたいな感じで10点制?で付けたいのです。 5人のC列に入る点数は勝率の一番高い人が基準で以下の人は基準からの 差で点数が減っていく感じです。 説明下手ですみません。

関連するQ&A

専門家に質問してみよう