ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA ランダムな値を返すRnd関数の使い方

ランダムな小数の値を返すRnd関数を解説します。

目次

Rnd関数は0より大きく1よりランダムな小さい値を返す

まずはRnd関数を知るために、Rnd関数で生成した値を単に表示するためのサンプルを作成します。単にRndと書くと0より大きく1より小さいランダムな小数の値を返します。

Sub Rnd関数サンプル()

    MsgBox Rnd

End Sub

Rnd関数の結果をメッセージボックスで表示しただけ
実行結果

ランダムな小数の値が表示されました。Rndは関数なのでRnd()とかいてももちろんOK です。今回は引数を取らない場合の解説なので、()は省略できます。

Rnd関数の使い所

Rnd関数の便利な使い所を2点、紹介します。

  • ランダムな選択肢を生成する
  • サンプルデータ用のランダムな値を生成する

順に解説します。

ランダムな選択肢を生成する

Rnd関数は0より大きく、1より小さい小数の値を返します。そのため、戻り値に整数を掛け算して、小数点部分を切り捨てれば、0からその掛けた整数-1までのランダムな整数を発生させることができます。これを利用しておみくじプログラムを作成してみます。

Sub Rnd関数サンプル()

    Dim r As Long
    
    r = Int(Rnd * 4)
    
    Select Case r
        Case 0
            MsgBox "大凶"
        Case 1
            MsgBox "小吉"
        Case 2
            MsgBox "中吉"
        Case 3
            MsgBox "大吉"
    End Select
    
End Sub

これで実行するたびに、大凶、小吉、中吉、大吉のいずれかがメッセージボックスに表示されるプログラムができました。ぽいんとは、r= Int(Rnd * 4) の部分です。Intは小数部分を切り捨てて、整数にする関数です。4をかけ算してから小数部分を切り取ることにより、0~3までの4つの値のいずれかを生成しています。それをおみくじの出力に割り当てています。

サンプルデータ用のランダムな値を生成する

次に、サンプルデータ用の値を生成する方法です。このブログもサンプルデータがよく出てきますが、販売単価や商品コードと言った値は、このRnd関数で生成しています。

たとえば5桁の商品コードを生成したい場合は、桁数が変わらないように文字の「a」と0~9の数字 x 4桁を連結しています。

Sub Rnd関数サンプル2()

    Dim i As Long
    Dim r As Long
    Dim 商品コード As String
    
    商品コード = "a"
    For i = 1 To 4
        r = Int(Rnd * 10)
        商品コード = 商品コード & r
    Next i
    
    MsgBox 商品コード

End Sub

5桁の商品コードが生成できた
実行結果

Randomizeステートメントと併せて使う

これまで特に問題がないように使ってきましたが、実は問題があります。それは、Rnd関数は厳密にはランダムな値を返す関数ではない、と言うことです。Rnd関数が初めて実行されたとき、一度だけ、乱数表が生成されます。それを順番に読み取っているだけです。

よっておみくじアプリなら何度も繰り返していると、同じ結果が出力されることがばれてしまいます。この乱数表を新たに毎回生成することによって、本当にランダムな値を得ることができます。方法は簡単でRnd関数を使うたびにRandomizeステートメントを記述するだけです。

Sub Rnd関数サンプル_改善バージョン()

    Dim r As Long
    
    Randomize  '←ここに一行足しただけ
    r = Int(Rnd * 4)
    
    Select Case r
        Case 0
            MsgBox "大凶"
        Case 1
            MsgBox "小吉"
        Case 2
            MsgBox "中吉"
        Case 3
            MsgBox "大吉"
    End Select
    
End Sub

業務の自動化プログラムにRnd関数を使う事はないと思いますが、テスト用のデータを生成するときなど便利なので、ご活用下さい!