スクリーンショット 2014 05 26 16 07 59

こんにちは、ジュン@jun3010meです。

今回は、「時間内に会場の中の人をランダムに指名できる仕組みをExcelで作れないか?」
という要望があったので、VBAを使ってそれっぽいのを作ってみました。

要望詳細

今回の要望の詳細はこんな感じ
**1.会場内の人を番号で指名する
2.1度当たった人は2度と当たらない
3.誰が当たるか分からないドキドキ感を出す
4.今何人目が当たったのか分かるようにする
5.Excel2013で作って欲しい

さて、それでは作っていきましょうか。

Excelの設定を変更する

スクリーンショット 2014 05 26 16 20 25

今回は、Excel2013を利用しますが、インストールしたままの状態だと、機能が足りません。

そこでまず、設定を変更して、「開発」タブを表示します。

スクリーンショット 2014 05 26 16 20 25

まず、「ファイル」をクリックします。

スクリーンショット 2014 05 26 16 25 33

「オプション」をクリックします。

スクリーンショット 2014 05 26 16 26 09

「リボンのユーザー設定」をクリックし、
「メイン タブ」の中の「開発」にチェックを入れ、「OK」をクリックします。

スクリーンショット 2014 05 26 16 30 15 これでリボンのタブに**「開発」**が追加されました。

レイアウトを考える

Excelの設定が終わったところで、どんな見た目にするのかを決めていきます。

僕はこんな感じにしていきました。
スクリーンショット 2014 05 26 16 38 00
A5に何番の人が当たったのかを表示し、
A2に何番目に当たっているのかを分かるようにしました。

ボタンを設置する

ボタンっていうのは、これのことです。

スクリーンショット 2014 05 26 16 07 59

**「ボタンをクリックしたら、シャッフルした番号が出てくる」**という感じにしたいので、
ここにボタンを設置します。

ボタンの設置方法

スクリーンショット 2014 05 26 16 43 08 先ほど設定で出した**「開発」をクリック**し、 **「挿入」をクリック**し、**左上の四角いアイコンをクリック**します。 スクリーンショット 2014 05 26 16 45 53

ボタンを設置すると、「マクロの登録」という表示が出てきます。
ここで**「新規作成」**をクリックします。

スクリーンショット 2014 05 26 16 51 08 すると、VBAの編集画面が表示されます。 このウィンドウの中の、**SubとEnd Subの間**にコードを書いていきます。

どんな感じのコードにするのか

ボタンの設置も済んだので、ここでどういった内容のマクロにするのかを書いておきます。

今回は2つのボタンを用意して、それぞれ別の働きをしてもらいます。
1つは、会場の人数分の番号をランダムに並べるボタン。
もう1つは、並べた数字を上から順番に、特定のセルに表示するボタンです。

スクリーンショット 2014 05 26 17 06 12

ボタンがもう1つ必要なので、さっきと同じ手順で追加しました。

ボタンの名前を変更する

スクリーンショット 2014 05 26 17 07 34

ボタンの名前を変更することで、ボタンをクリックしたら何が起こるのかを分かりやすく表示できますね。

スクリーンショット 2014 05 26 17 11 11 こんな感じにしました。

「シャッフルボタン」ボタンのコード

今回は、こちらのサイトのコードを参考にさせていただきました。
エクセル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

このコードを実行すると、こんな感じになります

スクリーンショット 2014 05 26 17 23 54 コード内の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に書き出します。

実行するとこんな感じ

スクリーンショット 2014 05 26 17 35 17 さっきのシャッフルボタンで作ったD列の数字を読み取ったので、 1番目には、32番の人が当たりました。 スクリーンショット 2014 05 26 17 35 38 2回目には、その下の27番の人が当たりました。

以上でシャッフルして番号をランダムで出す部分が出来ました。

最後の仕上げ

これで仕組みは完成したんですが、
D列の数字を誰かに見られてしまうと、
次に何番が当たるのかが知られてしまいます。

そんなトラブルを防ぐ為に、D列の数字を白で塗ってやりました。
スクリーンショット 2014 05 26 17 39 13
うん、よし。これでわからない。

おわりに

如何でしょうか。
本当は配列の中にランダムな数を入れて、順番に表示する方が賢い方法なのかもしれませんが、
僕はプログラマーではないので、少しExcelのセルを利用する形にしました。

もっとスマートなコードになる方法があったら、
是非とも教えていただきたいと思います。

良かったら参考にしてくださいヽ(=´▽`=)ノ

参考にさせていただいた、ブログ「satoの雑技術ノート」さん、
コードを一部利用させていただきました。
ありがとうございました。