かつてはPCでデタラメな数を生成することは、厳密には難しいことだったのですが、最近ではかなり巧妙に、二度と再現できないようなデタラメを作ってくれます。
少々大きな数の、例えば、顧客数から一定人数抜き出すようなことは意外と簡単にできるものです。
Excel では Rnd 関数を利用して、
今回は、VBA Rnd 関数を使用してExcelで数値をランダム化するいくつかのサンプルをチェックします。
どちらかというと、Excel入門者がVBAを始める際の超入門として良いサンプルです。
まずはじめに、エクセルのVBAコードは
例1:Excel VBA Randomize でランダム化
VBA 関数 Randomize でカスタマイズした乱数を生成するのは簡単です。
次のようにします。
step
1モジュールを作ります
Excelから先程の、
VBAウィンドウで、「挿入」メニューから「モジュール」タブを選択します。
step
2VBAコードを定義する
VBA Rz のサブカテゴリを作成するか、任意の名前でVBAコードを定義します。
下の例では
VBA_Rz
としました。
VBA
Sub VBA_Rz()
End Sub
step
3変数を定義します
VBA
Sub VBA_Rz()
Dim RN As Double
End Sub
ここでは、変数 RN を Double(データ型:倍精度浮動小数点)にしました。Double にしたのは、生成された乱数にちょっと変更が加わることを狙ってのことです。
step
4変数に関数を割り当てます
そして、定義済みの変数 RN に、VBA の Rnd 関数を割り当てます。
VBA
Sub VBA_Rz()
Dim RN As Double
RN = Rnd
End Sub
step
5Debug.Printで中身をチェック
生成した乱数を確認したいので、値を画面に表示するために Debug.Print を使います。
VBA
Sub VBA_Rz()
Dim RN As Double
RN = Rnd
Debug.Print RN
End Sub
Debug.Print
は途中の変数に何が入っているかを確認するために、画面出力させるときによく使います。
うまく動くことが確認できれば、Debug.Print
については普通はリリース時(公開時)に消してしまう(動かさない)ようにします。
(消さなくても構いませんが、冗長な表示になるので鬱陶しいはずです)
step
6変数を確認します
変数や数値を確認するために、[表示]メニューからイミディエイトウィンドウを開きます。
step
7コンパイルします
コードをコンパイルし、メニューバーの下にある[再生]ボタンをクリックして実行します。
イミディエイトウィンドウに最初の乱数が表示されます。
コンパイルそのものは自動で行われますので、[再生]ボタンをクリックするだけで大丈夫です。
また、コードを何度も何度も実行すると、さらにいくつかの乱数が表示されます。
step
8Randomize を先に実行して完璧な乱数に
Excel の Rnd 関数はデタラメをつくる関数のように思いがちですが、乱数を作り出す際に、シード値をみて乱数表から値を拾ってきているだけです。そのため、シード値が同じなら毎回決まった順番で乱数が返ります。ようするに、Excel を起動したときのシード値は毎回同じになります。
そのため、本気の乱数が欲しい場合は、Rnd 関数実行前に、Randomize を実行して Rnd 関数が取得していたシード値そのものをランダムにする必要があります。くじ引きなどでExcelを利用する人は、このことを強く意識しておきましょう。
VBA Sub VBA_Rz() Dim RN As Double Randomize RN = Rnd Debug.Print RN End Sub
step
9生成された数字が乱数かを確認
Randomize を Rnd 関数より先に実行することにより、Excel の毎回起動時に同じシード値が設定されることはありません。
逆に、乱数とはいえ、毎回同じ値を拾いたいこともあるはずですから、その場合は Randomize は省略しましょう。
同じコーディングでさらに実験してみます。次に、Rnd 関数と一緒にデータ型変換に使うCInt関数を使ってみます。
これで、生成された乱数(Double型)が整数(Integer型)に変換されます。
VBA Sub VBA_Rz1() Dim RN As Double RN = CInt(Rnd) Debug.Print RN End Sub
ここでもう一度コードを実行します。結果を見れば、乱数が整数として生成されていることがわかります。ただし、値は0から1の範囲です。
Double型でランダム値を使い続けても、値は0から1の間(というか0か1のどちらか)にしかなりません。
これは、Rnd 関数と一緒に Randomizeを使用したためです。 それでは、Rnd 関数に任意の数(ここでは20にします)を掛けてみましょう。
vba Sub VBA_Rz1() Dim RN As Double RN = CInt(Rnd * 20) Debug.Print RN End Sub
ここでもう一度コードを実行します。
これでやりたかったことができました。 生成されるランダム値は0より大きく、20未満になります。
上のコードの20の部分を好きな整数に書き換えれば、その好きな整数未満の数、0以上の整数が返ります。