抽選システムを作る
何かのキャンペーンで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列)に◎が出るようにしてください。
解説
D3に直接当選番号を入れるために、
Cells(3, 4) = Int(Rnd * n) + 1
としていましたが、
一旦これを変数 atari に入れることにします。
atari = Int(Rnd * n) + 1
例えば、atari が 6 の時、その人の行番号は 1 多い 7 です。
つまり atari + 1 が当選者の行番号になるので、C列(3列目)の当選者のいるセルは
Cells(atari + 1, 3) です。
ここに◎を入れればいいので、
Cells(atari + 1, 3) = "◎"
とすれば良さそうです。
ですが、これを実行するたびに少しずつ◎が増えていきます。
それはそれで面白いのですが、一人だけ抽選するという形式にするならば、一度C列をまっさらにクリアする方が良さそうです。
ということで、Columns(3).Clear を、◎を書き入れる命令の前に追加しましょう。
Columns(3).Clear
atari = Int(Rnd * n) + 1
Cells(atari + 1, 3) = "◎"
とすれば完成です。
最終的なコードはこちらです。
Sub chusen2()
'A列を元に最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
'人数nは最終行より1つ少ない
n = lastRow - 1
'C列の内容を一旦消す
Columns(3).Clear
'当選番号を変数 atari に入れ、当選者の横に◎を入れる
atari = Int(Rnd * n) + 1
Cells(atari + 1, 3) = "◎"
'当選番号をD4に表示
Cells(4, 4) = atari
End Sub
エクセルマクロ(EXCEL VBA) その18 文字列の置換(Replace)
(文:森脇孝/エントレ)