エクセルマクロ(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)
(文:森脇孝/エントレ)