この記事を読むのに必要な時間は約 4 分です。
VBAで乱数を生成する方法についての記事です。
Rndという関数を使うんですが、単純にRndと書いて実行しても、思ったような結果は得られないと思います。
整数の数字が欲しければ、ある数字を掛け算しないといけません。
数学の公式みたいなものですが、テストじゃないので必要なときに何回見直しても大丈夫です。
今回は、簡単な使用例も交えて紹介します。
目次(リンク)
VBAの乱数を生成する関数はRnd
まずは、Rndという関数を実行してみたいと思います。
結果はDebug.Printで表示して確認です。
1 2 3 4 5 |
Sub testRnd() Debug.Print Rnd End Sub |
このソースコードをF5キー連打した結果が、下図のイミディエイトです。
確かにバラバラの数字だけど、欲しいのはこんなのじゃないですよね。
特定の範囲を指定して、ランダムな整数が欲しいはずです。
範囲指定して乱数を発生させるRndの使い方
書き方はこれです。
1 |
Int((最大値 - 最小値 + 1) * Rnd + 最小値) |
引数に最小値:lMinと、最大値:lMaxを渡して、最小値から最大値の間の整数を返す関数を書きました。
ソースコードはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'引数1:lMin 乱数の最小値 '引数2:lMax 乱数の最大値 '戻り値:生成した乱数 Private Function getSelectNo(ByVal lMin As Long, ByVal lMax As Long) As Long getSelectNo = 0 '乱数初期化 Randomize '最小値から最大値の範囲で乱数を生成 getSelectNo = Int((lMax - lMin + 1) * Rnd + lMin) End Function |
1~10までの数字をランダムに表示してみた
先ほどの関数を使って、範囲を指定して数字をランダムに表示してみたいと思います。
何度もF5キー連打は少々カッコ悪いので、For文で20回ループさせて、生成した数字をDebug.Printでイミディエイトウィンドウに表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Public Sub createRnd() Dim lCnt As Long Dim lMax As Long Dim lMin As Long '乱数の最大値 lMax = 10 '乱数の最小値 lMin = 1 '20回ループ For lCnt = 1 To 20 '〇〇回目:生成した乱数 Debug.Print lCnt & "回目:" & getSelectNo(lMin, lMax) Next lCnt End Sub |
20回乱数を生成した結果はこちら。
1~10の間だと、さすがに同じ数字が連続することもよくあります。
100くらいあれば、被ることはそれほどありません。
ちなみにIntは整数にする関数です。
外せば小数の結果も得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub testRnd() Dim lCnt As Long Dim lMax As Long Dim lMin As Long lMin = 1 lMax = 30 For lCnt = 1 To 20 Debug.Print lCnt & "回目:" & (lMax - lMin + 1) * Rnd + lMin Next lCnt End Sub |
小数点以下の数字も切り捨てられず表示されました。
まとめ:エクセルVBAで乱数を範囲指定して生成する方法
VBAでRndを使って乱数を生成する方法でした。
よく使われる、整数の結果を得たい場合のやり方をもう1度書きます。
1 |
Int((最大値 - 最小値 + 1) * Rnd + 最小値) |
特定の範囲でランダムに数字を選ぶので、抽選するときなどに利用されることもあります。
先日書いた抽選マクロの記事も、何か参考になるかもしれません。
最後までお読みいただき、ありがとうございました。
Excel VBA勉強中で、よく利用させていただいております。
一つ、範囲指定して乱数を発生させるRndの使い方のセクションにて
ソースの画像と赤枠コメントが一致しておりません。
それだけになります、失礼いたしました。
suzuさん、ご指摘ありがとうございます。
最小値のところを最大値と記載してしまっていたので直しました。
すごく助かりました!!
Excel VBAの勉強、頑張ってくださいね。
私も役立ててもらえるような記事を、少しずつ書いていければと思います。