• 締切済み

Excel VBAでランク上位から配分する方法

たとえば、1位~5位までの順位を成績順に決めて、賞品3つ(商品の数は毎回変動する)を1つずつ上位から分けたいのですが、vbaで上記を行うにはどのように記述すればよいでしょうか。 イメージは、賞品の数が書いてあるセルがあり(上記の例では3)、そのセルの数値が0になるまで上位から分けていく、というものです。商品の数によっては当たらない人もいます。よろしくお願いします。

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

補足拝見しましたが、VBAでやる必要性が感じられません。 関数で十分ではないでしょうか。 添付の図の例では、E2に賞品数を入れ、C2には↓の式を入れ下にコピーしています。 =IFERROR(IF($E$2>=RANK(B2,B:B),RANK(B2,B:B),""),"") これで如何でしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! VBAでの一例です。 ↓の画像のような配置になっていて、「賞品数」はF2セルに入力済みとします。 C列順位(同順位なし)は操作しなくても良いようにコードに組み込みました。 (同順位の場合は上側が上位としています) A・B列にデータがあるとします。 ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() Dim i As Long, k As Long, cnt As Long, lastRow As Long Dim c As Range, myAry myAry = Array(1, 2, 3, 4, 5) lastRow = Cells(Rows.Count, "B").End(xlUp).Row If lastRow > 1 Then Range(Cells(2, "C"), Cells(lastRow, "D")).ClearContents End If Range(Cells(2, "C"), Cells(lastRow, "C")).Formula = "=COUNTIF(B:B,"">""&B2)+COUNTIF(B$2:B2,B2)" 0: For k = 0 To UBound(myAry) Set c = Range("C:C").Find(what:=myAry(k), LookIn:=xlValues, lookat:=xlWhole) c.Offset(, 1) = c.Offset(, 1) + 1 cnt = cnt + 1 If cnt >= Range("F2") Then Exit For Next k If cnt < Range("F2") Then GoTo 0 End If End Sub ※ データ変更があるたびにマクロを実行してください。m(_ _)m

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1625/2467)
回答No.3

VBAでなくてもRANK関数で順位を決めて、たとえば順位の入ったセルがB列で商品の数の入ったセルがE1だとして、C列に結果を表示するとした場合、C1に以下の式を入れて下にコピーすると商品数分の順位までの人に配分と表示されます。 =IF(AND(B1<>"",B1<=5,B1<=$E$1),"配分","") RANK関数は使うとして VBAだと以下のような感じでも Sub Example() Dim c As Range Dim ItemsCount As Integer If Range("E1").Value > 5 Then ItemsCount = 5 Else ItemsCount = Range("E1").Value End If Range("C:C").ClearContents For Each c In Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row) If c.Value <> "" And c.Value <= Range("E1").Value And c.Value <= 5 Then Range("C" & c.Row) = "配分" ItemsCount = ItemsCount - 1 If ItemsCount = 0 Then Exit For End If End If Next End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

A1からA5セルに順位が記入してある D1セルに賞品個数が記入してある sub macro1() range("B1:B5").formula = "=IF(A1<=SMALL(A:A,D$1),""○"","""")" end sub

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

補足願います。 同点等で同じ順位の人が複数いた場合はどうするのでしょう? 例:賞品3つ、1位:1名、2位:1名、3位;2名

visitor7777
質問者

補足

mt2008様、 ご回答ありがとうございます! 同点は発生しない前提で考えています。 質問では成績順と記載しましたが、 イメージとしては、同点が発生しないように乱数を発生させ、順位付けする。 そしてランキング上位から賞品を分配する。 分配する際のイメージは、a) 賞品5つ以下、1位~5位まで各1名、b)もしくは商品5つ以上、1位~5位まで各1名です。 賞品数分ループ分を回すようにして、賞品がある回数分処理を回して分配したいです。 つたない説明で申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルvbaで、ランク順に配分する

    たとえば、1位~5位まで順位を成績順に決めて、賞品3つ(商品の数は毎回変動する)を1つずつ上位から分けたいのですが、vbaで上記を行うにはどう記述すればよいでしょうか。 イメージは、賞品の数が書いてあるセルがあり(上記の例では3)、そのセルの数値が0になるまで上位から分けていく、というものです。商品の数によっては当たらない人もいます。よろしくお願いします。

  • エクセルのRANK関数の応用

    エクセルのRANK関数を使って、順位を表示させたいのですが、 空白セルと、"0"の値が1位にカウントされてしまいます。 これを除外して表示させる方法は無いようなので、 これをVBAで作る事は出来ますでしょうか? "0"と空白セルは除外し、数値の小さい順に表示させたいのです。 以上よろしくお願いします。

  • エクセル2010でRANK関数に条件を付けるとき

    エクセル2010を使っている者です。 RANK関数で順位をつけても同順位だった場合、他の条件で判定することは可能でしょうか? 過去の質問も見たのですが、私のしたいこととは違う事例なんですね。 具体的には、添付画像のような表でドント式で順位をつけようと思っています。 オレンジ色にしたセルに、一つ右のセルの値について数値の高い順に順位をつけていき(全列のオレンジ色のセルの右の値の中での順位です)、値が同じであれば「総数」の値の大きい列のセルのほうが上位になるというようにしたいと思っています。 どうぞ、よろしくお願いいたします。

  • エクセルVBAの記述について

    OSはWin98、エクセル2000です。 次の処理をVBAで処理したいのですがうまく作動しま せん。 ご教授願います。 セルA1から下に向かって1から20までランダムに数 値が入ってます。 同じ数値は無く、数値も3行(セルA3)で終わる場合 も有ります。 この場合セルC1から下に向かって順にA1&A2、A 1&A3と記述したいのですが・・・ 例) A1に5、A2に7、A3に15、A4に10でしたら C1に57、C2に515、C3に510、C4に715 C5に710、以下・・・と記述 よろしくお願いします。m(_ _)m

  • エクセルVBAでどうしても参考書通りにならない!!

    私はFOMエクセルエキスパートの問題集をもとに勉強しています。 あるVBAの問題でどうしても結果が同じようにならないのです。 問題は、最初から、形のあるシートAに「来場者数ベストという名前でマクロの記述」記述内容「来場者数が多い順⇒上位3件のレコードを青、セルA1を選択」   次に「リセットという名前でマクロの記述」⇒記述内容「上位3件のレコードを黒、ナンバー順に並びかえる、A1を選択」 この2つのマクロをシートAに「ボタン」として2つ作りました。この時点では、問題はありません。どちらのボタンを押してそれぞれのマクロが記述されます。 この後のVBAでひっかかっています。 VBEを使ってマクロ「来場者数ベストの上位3件のレコードが青であったものを、上位5件のレコードを赤にする。」そうすると、なぜかここでもう一方のマクロ「リセット」の方の表の一覧に、指定もしていないのに「赤のレコードが2件」出てくるのです。 なぜでしょう? 文字だけで、説明しております。なかなかお伝えづらいのですがご回答いただけるのであれば是非よろしくお願いします。

  • エクセルであるデータの個数を表示させる方法について

    以前エクセルで10人の順位(順位は関数を用いました。また、当該順位を決めるための検査を10回行っているものとする)について、上位三人を条件付き書式を用い下位三位と条件設定(この場合における数値は、小さい方が上位の順位を示すことになるから)した上でセルを緑色にすること・下位三人を同じく条件付き書式を用い上位三位と条件設定(この場合における数値は、大きい方が下位の順位を示すことになるから)した上でセルを赤色にしました。 その10人の成績の決め方はあるものを有している個数で、ただ当該10人が異なる所有数であればよかったのですが、残念ながら数値が同数の人が上位・下位それぞれ三位内にいました。 その場合、たとえば下位四人の数値が同じときその四人には六位(同一六位で四人)が付くと思い、その状態で条件付き書式を用いると下位四人のセルが赤色になると思われます。 それはそれでいいのですが、個人的にはcountifを用い10回行った結果として各10人それぞれが下位三位になった回数(たとえば、Aさんは2回・Bさんは5回など)も記載したいと思っており、ただ前段落に記載したような六位が四人などのケースの場合、六位と記載されることにより七位以下とはカウントされないと思われます。 そのためやり方を変え、当該各10人それぞれについている赤色のセルの数(たとえば、Cさんに1つなど)をカウントすることにしましたが、方法がわかりません。 そこで質問ですが、条件付き書式などで赤色のセルになった個数をカウントするためには、どのようにすればいいでしょうか。

  • RANK関数の基本?

    教えてください。 順位をつける表があります。(元の問題は、「合計点をもとに成績の順位を求めましょう」です) RANK関数をつかったのですが、=Rank(数値、セル範囲、順序)と なりますよね。 で、答えを見ると順序が、省略されています。(0は省略できますよね) 問題には、昇順とか、降順は全く表示されていません。 これは、順位をつける関数は、順序は降順(点数(数値)の高い順でつける)でつけるのが当たり前という概念に基づいているからなんでしょうか。 宜しくお願いいたします。

  • Excel VBA 組み合わせパターン

    A1~A5 に、順に 「あ」「い」「う」「え」「お」が入っています。 B1に「3」を入れたとき C1以降、各セル1文字ずつで、 あああ ああい ああう …(略) おおえ おおお といった具合に表示させたいのです。 VBAで簡単にできるでしょうか。 ※A列のデータ数は変動します。

  • Yahooディレクトリのランクについて

    サーチエンジンでの上位表示対策という意味において Yahooディレクトリのランク(順位付け)についてお尋ねいたします 僕は以前からABC順やあいうえお順とばかり思っていたのですが、そうではないようです 結構順位の変動があるようなのですが、どういう要因で順位が決まるのでしょうか?

  • セルの文字式の計算をVBAで行いたい

    A1のセルに "100+5n" という文字式が入っている状態で VBAにてこのセルの文字式計算を行いB1のセルから順に結果を出力したいと思っています。 "n"は1から順に指定された数まで1づつ増えていくようにし B1のセル:105、C1のセル:110、D1のセル:115 ・・・・ と結果がなるようにしたいのですが、VBAでどのように記述すればいいのか悩んでいます。 VBAを使わずにExcelの関数で計算できるのならそれでもよいと思っています。

専門家に質問してみよう