エクセルマクロ(EXCEL VBA)

エクセルマクロ(EXCEL VBA) その17 抽選システムを作る(Rnd)

抽選システムを作る

何かのキャンペーンでTweetしてくれた人や、何かを買ってくれた人を対象に、抽選で○名様に△△をプレゼント!
というのは、よくある企画です。

数名だったら、『この人とこの人!』と適当に決めればいいんですが、ちゃんとランダムに決めるシステムを作ってみましょう。

こんな対象者リストがあったとします。

氏名のリスト

それぞれには番号が振ってあるので、1~10の数字が出るような抽選システムを作って、その番号が出た人が当たり、ということにしてみましょう。
ランダムな数値を生成するには Rnd という関数を使います。
試しに、D3あたりにランダムな数値を出してみましょう。
D3は、Cells(3, 4)なので、

Sub chusen()
Cells(3, 4) = Rnd
End Sub

ランダム

と書きます。
これを実行すると、

ランダムな数値が出せた

今回は0.579・・・という値でしたが、実行するたびに値は変わります。
なおここで生成される数値の範囲は、0以上 1未満です。

では、1~10の数字を出せるようにするにはどうしたらいいでしょうか?
まずは10倍して、小数点以下を切り捨てるのはどうでしょう。
そうすると、0 ~ 9 のどれかが出るはずなので、1を足せば 1 ~ 10の目が出るようになるはずです。
小数点以下を切り捨てるには、Int を使うとよいようですので、

Cells(3, 4) = Int(Rnd * 10) + 1

としてみます。

抽選できるようになった

 
ところで、対象者が10人ではなく、12人だったらどうしたらいいでしょう?

実は先ほど10を掛けたところを12にするだけで大丈夫です。

Cells(3, 4) = Int(Rnd * 12) + 1

なぜなら、(Rnd * 12)の最大値はおよそ 0.99999 × 12 = 11.9998
Intで小数点以下を切り捨てるので Int(11.9998) = 11
Int(Rnd * 12) + 1 = 11 + 1 = 12 となるからです。

数字を変更すれば良いはず

最終行を使う

ところで、その13でやったように、リストの最終行は、数値として取得できるのでした。

最終行数を変数 lastRow に入れることにすると、

lastRow = Cells(Rows.Count, 1).End(xlUp).Row

と書けます。
1行目はNo.という項目の行なので、lastRowは、抽選人数よりも 1 多い数になるはずです。

なので、抽選人数を n 人とすると

n = lastRow - 1

とできるので、

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
n = lastRow - 1
Cells(3, 4) = Int(Rnd * n) + 1

これで、人数が増えても、抽選で番号を出せるシステムができました。

 
今回の最終的なコード

Sub chusen()
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
n = lastRow - 1
Cells(3, 4) = Int(Rnd * n) + 1
End Sub

 

宿題-17
当選した人の横(C列)に◎が出るようにしてください。

エクセルマクロ(EXCEL VBA) その18 文字列の置換(Replace)

(文:森脇孝/エントレ)

関連記事一覧