この記事を読むのに必要な時間は約 6 分です。
VBAで乱数を生成する方法についての記事です。
Rndという関数を使うんですが、単純にRndと書いて実行しても、思ったような結果は得られないと思います。
整数の数字が欲しければ、ある数字を掛け算しないといけません。
数学の公式みたいなものですが、テストじゃないので必要なときに何回見直しても大丈夫です。
今回は、簡単な使用例も交えて紹介します。
VBAの乱数を生成する関数はRnd
まずは、Rndという関数を実行してみたいと思います。
結果はDebug.Printで表示して確認です。
Sub testRnd()
Debug.Print Rnd
End Sub
このソースコードをF5キー連打した結果が、下図のイミディエイトです。

確かにバラバラの数字だけど、欲しいのはこんなのじゃないですよね。
特定の範囲を指定して、ランダムな整数が欲しいはずです。
範囲指定して乱数を発生させるRndの使い方
書き方はこれです。
Int((最大値 - 最小値 + 1) * Rnd + 最小値)
引数に最小値:lMinと、最大値:lMaxを渡して、最小値から最大値の間の整数を返す関数を書きました。

ソースコードはこちら。
'引数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でイミディエイトウィンドウに表示させます。
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は整数にする関数です。
外せば小数の結果も得られます。
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度書きます。
Int((最大値 - 最小値 + 1) * Rnd + 最小値)
特定の範囲でランダムに数字を選ぶので、抽選するときなどに利用されることもあります。
先日書いた抽選マクロの記事も、何か参考になるかもしれません。
最後までお読みいただき、ありがとうございました。






Excel VBA勉強中で、よく利用させていただいております。
一つ、範囲指定して乱数を発生させるRndの使い方のセクションにて
ソースの画像と赤枠コメントが一致しておりません。
それだけになります、失礼いたしました。
suzuさん、ご指摘ありがとうございます。
最小値のところを最大値と記載してしまっていたので直しました。
すごく助かりました!!
Excel VBAの勉強、頑張ってくださいね。
私も役立ててもらえるような記事を、少しずつ書いていければと思います。