一定範囲の乱数を取得する|Excel VBA |
VBAで乱数を取得するにはRnd関数を使います。
Rnd関数は、0以上1未満のランダムな小数を返すので、整数の乱数が欲しいときには工夫が必要です。
戻り値は0以上1未満の数なので、Rnd関数が返す数値の整数部分は、いつでも0です。
そこでRnd関数の結果を10倍して、小数第1位を整数の位置に繰り上げます。
このようにInt関数で整数部分を抜き出すことで、整数の乱数を取得できます。
Sub Sample1()
Debug.Print Int(Rnd * 10)
End Sub
Rnd関数は0を返すこともあるので、サンプル1は「0〜9」を取得できます。
もし2桁の乱数が欲しいときは100倍すればいいですね。
では、任意の整数ではなく「1から31の範囲で乱数」を取得するには、どうしたらいいでしょう。
たとえば、トランプのカードをシャッフルするようなイメージです。
プログラミング的に考えれば、まずRnd関数で整数の乱数を作り、その整数が範囲内かどうかを調べ、すでに登場した整数かどうかを判定して、配列に格納するなどの方法が思いつきます。
その方法については「重複のない、ランダムな数をセルに代入する」を参照してください。
ここでは、セルやワークシート関数を使った、Excel VBAならではの方法をご紹介します。
まず、ワークシートに1から31までの数値を入力しておきます。
ここではアクティブシートのセル範囲A1:A31に入力しておくものとします。
次に、セル範囲B1:B31に「=RAND()」というワークシート関数を入力しておきます。
このセル範囲A1:B31を、B列をキーにして並べ替えれば、A列の「1〜31」がランダムに並びます。
あとは、セル範囲A1:A31を上から順番に取得すればいいのです。
Sub Sample2()
Dim i As Long
Range("A1:B31").Sort Key1:=Range("B1"), Header:=xlGuess
For i = 1 To 31
Debug.Print Cells(i, 1).Value
Next i
End Sub
あらかじめ1から31の数字やRAND関数をワークシートに準備できないときは、新しいワークシートを挿入して、それを利用すればいいでしょう。
もちろん、挿入したワークシートは最後に削除しておきます。
Sub Sample3()
Dim i As Long
With Worksheets.Add
For i = 1 To 31
.Cells(i, 1).Value = i
Next i
.Range("B1:B31").Formula = "=RAND()"
.Range("A1:B31").Sort Key1:=.Range("B1"), Header:=xlGuess
For i = 1 To 31
Debug.Print .Cells(i, 1).Value
Next i
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
End Sub
プログラミングには発想が大切です。
Excel VBAでマクロを作成するときは、セルやワークシート関数などExcelが持つ機能を活用することで、プログラミングの幅が広がります。