例2:Excel VBA 乱数生成
別の例で、VBA の Randomize がどのように機能するかを確認してみます。
Randomizeと一緒にいくつかの数式を適用し、乱数生成法が乱数値の生成にどう働くかをみてみます。
ただし、本例では、メッセージボックスに出力するようにします。これを行うには、以下の手順に従います。
step
1先程の例に加えて関数作成
モジュールで、以下に示すようにVBA Rzのサブカテゴリを記述します。
VBA
Sub VBA_Rz2()
End Sub
step
2整数型で定義する
例1とは違って、変数を、今度は整数型で定義します。
VBA Sub VBA_Rz2() Dim RN As Integer End Sub
step
3Randomize 関数をまず使う
数式を入力する前に、Randomize 関数を使って、シード値をシャッフルします。
VBA Sub VBA_Rz2() Dim RN As Integer Randomize End Sub
step
4適当な数式を入れてみる
次に、下の例に倣って、必要に応じて、足し算、引き算などの数式をいれてみます。
VBA Sub VBA_Rz2() Dim RN As Integer Randomize RN = Int((300 - 200 + 1) End Sub
この段階では変数RN
は整数値101でしかありません。
step
5Rnd 関数も使ってみる
Rnd 関数をここで使って、乱数を発生させます。
VBA Sub VBA_Randomize2() Dim RN As Integer Randomize RN = Int((300 - 200 + 1) * Rnd + 200) End Sub
普通に使われる数式の大半がこの段階で(代りに)使えます。
step
6Msgboxで値を確認する
Msgbox を利用して、生成された乱数の中身を確認します。
VBA Sub VBA_Rz2() Dim RN As Integer Randomize RN = Int((300 - 200 + 1) * Rnd + 200) MsgBox RN End Sub
step
7コードを実行します
乱数は300のような値が返ります。これは、数値に($300 - 200 + 1$)を掛けてから、200を足しているため、1以上300以下の整数が返ります。
というのは、生成される乱数そのものは小さい値に過ぎないのですが、数式で数を大きく割増しているので、300のような値を返すことになります。
そして、コードを再度実行すると、メッセージは先ほどと違う値の 258になります。
VBA Rnd 関数 のキモ
Rnd()
として普通に使うと、シード値が変わらないので、Excel を起動してから生成する乱数は毎回同じパターになる。
Randomize
して、Rnd()
を使うと、シード値がシャッフルするので、Excel を起動するタイミングに関わらず再現性の低い乱数が生成できる。
また、Rnd()
の引数には、正の値、ゼロ(0)、負の数値の3パターンある。引数は省略でき、省略した場合は正の値を入れたものとして扱われる(デフォルト)。
- 正の引数値:(シード値から参照される)次の乱数の値を返し。引数を省略したときと同じ
- ゼロ(0):直前の乱数の値を返す
- 負の引数値:シード値を指定して乱数を返す
わかりやすく解釈すると、Rnd(0)
とやると、乱数値は固定される。
好きな乱数が出たら、すかさずRnd(0)
としてやると、ずっと同じ数(直前のRnd()
で出した数)を使い続けることができる。
Rnd(-1)
というように、負の数を入れると、シード値が固定されるので、毎回ワンパターンの乱数値が並ぶ。
Excel VBA Randomize を使うメリット
- 任意の範囲で任意の乱数を生成できる
- 範囲が制限されても、乱数の生成に制限はつかない
- 0より大きい乱数生成の範囲を制限できる
覚えておくべきこと
- Randomize は、さまざまな関数で使える。Rnd 関数と使うことで、パターン化された乱数もが、より乱数になる
- Randomize は、Rnd 関数と一緒に使うことで、0から1までの乱数を出せる
-
[VBA]Excel でランダム抽出するマクロ
かつて予想外に速攻作成に悩んだのが、Excel VBA で一覧からの無作為(ランダム)抽選です。ランダムは追求すると難し ...
続きを見る