こんにちは、ジュン@jun3010meです。
今回は、「時間内に会場の中の人をランダムに指名できる仕組みをExcelで作れないか?」
という要望があったので、VBAを使ってそれっぽいのを作ってみました。
要望詳細
今回の要望の詳細はこんな感じ
**1.会場内の人を番号で指名する
2.1度当たった人は2度と当たらない
3.誰が当たるか分からないドキドキ感を出す
4.今何人目が当たったのか分かるようにする
5.Excel2013で作って欲しい
Excelの設定を変更する
今回は、Excel2013を利用しますが、インストールしたままの状態だと、機能が足りません。
そこでまず、設定を変更して、「開発」タブを表示します。
まず、「ファイル」をクリックします。
「オプション」をクリックします。
「リボンのユーザー設定」をクリックし、
「メイン タブ」の中の「開発」にチェックを入れ、「OK」をクリックします。
レイアウトを考える
Excelの設定が終わったところで、どんな見た目にするのかを決めていきます。
僕はこんな感じにしていきました。
A5に何番の人が当たったのかを表示し、
A2に何番目に当たっているのかを分かるようにしました。
ボタンを設置する
ボタンっていうのは、これのことです。
**「ボタンをクリックしたら、シャッフルした番号が出てくる」**という感じにしたいので、
ここにボタンを設置します。
ボタンの設置方法
先ほど設定で出した**「開発」をクリック**し、 **「挿入」をクリック**し、**左上の四角いアイコンをクリック**します。ボタンを設置すると、「マクロの登録」という表示が出てきます。
ここで**「新規作成」**をクリックします。
どんな感じのコードにするのか
ボタンの設置も済んだので、ここでどういった内容のマクロにするのかを書いておきます。
今回は2つのボタンを用意して、それぞれ別の働きをしてもらいます。
1つは、会場の人数分の番号をランダムに並べるボタン。
もう1つは、並べた数字を上から順番に、特定のセルに表示するボタンです。
ボタンがもう1つ必要なので、さっきと同じ手順で追加しました。
ボタンの名前を変更する
ボタンの名前を変更することで、ボタンをクリックしたら何が起こるのかを分かりやすく表示できますね。
こんな感じにしました。「シャッフルボタン」ボタンのコード
今回は、こちらのサイトのコードを参考にさせていただきました。
エクセルVBAで1~25までの数字をランダムに発生させる処理を考えてみました
このサイトでは、1〜25までの数字をランダムに発生させるVBAを公開していました。
これを元にして作ったのが、こちらのコードです。
**Const MIN = 1
Const MAX = 41 ‘全員で41人いるとします。
Dim num As Integer
Dim a_num(MIN To MAX) As Integer
Dim flag(MIN To MAX) As Boolean
Dim cnt As Integer
‘乱数を初期化します
Randomize
For cnt = MIN To MAX
Do
‘乱数=Int((最大値 – 最小値 +1 ) * Rnd + 最小値)
num = Int((MAX – MIN + 1) * Rnd() + MIN)
Worksheets(“Sheet1”).Cells(cnt, 4).Value = num
Loop While flag(num)
a_num(cnt) = num
flag(num) = True
Next cnt
Worksheets(“Sheet1”).Range(“E1”).Value = 0
このコードを実行すると、こんな感じになります
コード内のMAXで指定した数分、 D列にランダムな数字が出てきます。コード内のこの部分、
**Worksheets(“Sheet1”).Cells(cnt, 4).Value = num
**
これのcntというのが繰り返しで回している行番号、4というのが列番号なので、
D列の1行目から順番に、下に向かってランダムな数が書かれていくわけです。
「次はこの人!」ボタンのコード
もう1つのボタンのコードはこんな内容です。
**Dim count As Integer
Dim ataru As Integer
Dim i As Integer
For i = 1 To 41’ただの演出です
Worksheets(“Sheet1”).Range(“A5”).Value = i
Application.Wait [Now() + TimeValue(“0:00:00.0005”)]’シャッフルしている感じの演出
Next i
Worksheets(“Sheet1”).Range(“E1”).Value = Worksheets(“Sheet1”).Range(“E1”).Value + 1
ataru = Worksheets(“Sheet1”).Range(“E1”).Value
Worksheets(“Sheet1”).Range(“A5”).Value = Worksheets(“Sheet1”).Cells(ataru, 4).Value
このコードでは、A5で番号を1〜41までを順番に表示し、ルーレットを回している感じを出します。
その後で、今が何番目なのかを数える為に数をカウントします。
カウントした数字は、E1に書き出します。
最後に、D列のカウントした数字の行を読み取って、ルーレット感を出したA5に書き出します。
実行するとこんな感じ
さっきのシャッフルボタンで作ったD列の数字を読み取ったので、 1番目には、32番の人が当たりました。 2回目には、その下の27番の人が当たりました。以上でシャッフルして番号をランダムで出す部分が出来ました。
最後の仕上げ
これで仕組みは完成したんですが、
D列の数字を誰かに見られてしまうと、
次に何番が当たるのかが知られてしまいます。
そんなトラブルを防ぐ為に、D列の数字を白で塗ってやりました。
うん、よし。これでわからない。
おわりに
如何でしょうか。
本当は配列の中にランダムな数を入れて、順番に表示する方が賢い方法なのかもしれませんが、
僕はプログラマーではないので、少しExcelのセルを利用する形にしました。
もっとスマートなコードになる方法があったら、
是非とも教えていただきたいと思います。
良かったら参考にしてくださいヽ(=´▽`=)ノ
参考にさせていただいた、ブログ「satoの雑技術ノート」さん、
コードを一部利用させていただきました。
ありがとうございました。