サイトアイコン エントレ|演劇動画ニュース

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

エクセルマクロ(EXCEL VBA)

抽選システムを作る

何かのキャンペーンで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)

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

モバイルバージョンを終了