HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 一定範囲の乱数を取得する

一定範囲の乱数を取得する|Excel VBA

セル操作関連のテクニック

一定範囲の乱数を取得する

(Excel 2000/2002/2003/2007/2010)

VBAで乱数を取得するにはRnd関数を使います。
Rnd関数は、0以上1未満のランダムな小数を返すので、整数の乱数が欲しいときには工夫が必要です。
戻り値は0以上1未満の数なので、Rnd関数が返す数値の整数部分は、いつでも0です。
そこでRnd関数の結果を10倍して、小数第1位を整数の位置に繰り上げます。
このようにInt関数で整数部分を抜き出すことで、整数の乱数を取得できます。

●サンプル1●

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を上から順番に取得すればいいのです。

●サンプル2●

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関数をワークシートに準備できないときは、新しいワークシートを挿入して、それを利用すればいいでしょう。
もちろん、挿入したワークシートは最後に削除しておきます。

●サンプル3●

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が持つ機能を活用することで、プログラミングの幅が広がります。