ExcelVBA でランダムな整数を生成する方法

2021年9月7日 2023年11月8日
カテゴリ: プログラミング
Excel ExcelVBA 乱数

ExcelVBA でランダムな数字を生成するときに活躍するのが Rnd 関数ですが、この関数が返すのは 0 以上 1 未満のランダムな数値で初心者の方からしたら「思ってたんと違う」ってなりますよね。

Sub example1()
  Debug.Print Rnd
End Sub

求めているものはきっと任意の長さのランダムな整数ですよね?
安心してください。 Rnd 関数を元にしてランダムな整数は作れます!

0 から 9 までのランダムな整数を生成する

まずは基本的なところから。

Sub example2()
    Dim randomNumber As Integer

    Randomize
    randomNumber = Int(Rnd * 50)
    Debug.Print randomNumber
End Sub

ランダムな整数を生成するので格納する変数 randomNumber は Integer 型にします。

Randomize は疑似乱数テーブルのハッシュ値をシステム時間を元にしたハッシュ値にするというもので … Rnd 関数を使う際のおまじないと思っておけば OK です。

Rnd * 10 とすると 0 以上 10 未満のランダムな数値が帰ってきます。
ただしそのままだと浮動小数点数になるので Int 関数で整数に変換します。

Debug.Print で生成したランダムな整数をイミディエイトウィンドウに表示します。

Rnd * 10 の部分をたとえば Rnd * 50 とすると 0 から 49 までのランダムな整数を生成することができます。

n から m までのランダムな整数を生成する

上記の例だと最小値は「0」、最大値は 「Rnd 関数に掛け合わせた数値 - 1」となりましたが、最小値と最大値を指定したい場合は次のようにします。

Sub example3()
    Dim n As Integer ' 最小値
    Dim m As Integer ' 最大値
    Dim randomNumber As Integer

    n = 10
    m = 150

    Randomize
    randomNumber = Int(Rnd * (m - n + 1) + n)
    Debug.Print randomNumber
End Sub

これを応用すればサイコロのように 1 から 6 までのランダムな整数を生成することもできますね。

桁数を指定したランダムな整数を生成する

桁数を指定してランダムな整数を生成したい場合もありますよね。

Rnd 関数に 10 を掛ければ 1 桁、 100 を掛ければ 2 桁のランダムな整数が得られます。
つまり Rnd 関数に 「10 の桁数乗」の数値を掛ければいいわけです。

まずは下記のコードを試してみてください。

Sub example4()
    Dim length As Integer ' 桁数
    Dim randomNumber As Integer

    length = 5

    Randomize
    randomNumber = Int(Rnd * 10 ^ length)
    Debug.Print randomNumber
End Sub

このコードを実行するとどうなるでしょうか。
ちゃんと 5 桁の整数が生成される場合もありますが、高確率で「オーバーフローしました」と表示されるはずです。

これは ExcelVBA の Integer 型が -32768 から 32767 までの範囲の数値しか扱えないからです。
(生成された整数が 32767 以下ならエラーメッセージは表示されません)

ちなみに Long 型は -2147483648 から 2147483647
LongLong 型は -9223372036854775808 から 9223372036854775807 までの範囲の数値を扱えます。

なので 18 桁までなら LongLong 型を使えば収まります。

Sub example5()
  Dim length As Integer ' 桁数
  Dim randomNumber As LongLong ' ←ココ

  length = 18

  Randomize
  randomNumber = Int(Rnd * 10 ^ length)
  Debug.Print randomNumber
End Sub

もっと長い桁数のランダムな整数を生成したい

例えば 50 桁の整数を生成したい場合どうすればよいでしょう。
50 桁ともなると ExcelVBA の数値型では扱いきれません。

そんな時は文字列にしちゃいましょう
数値としては扱えなくなりますが、そもそもそんな長い桁数の数値を計算に使うこともありませんよね?

文字列にしちゃいましょう。

Sub example6()
    Dim length As Integer
    Dim randomString As String
    Dim i As Integer

    length = 50

    Randomize
    For i = 1 To length
        randomString = randomString & Trim(Str(Int(Rnd * 10)))
    Next i

    Debug.Print randomString
End Sub

以下、簡単な解説です。

ランダムな整数(文字列)を格納する変数として randomString を String 型で定義します。

For 文で length で指定した回数分だけ 0 から 9 のランダムな整数を生成し、文字列としてくっつけていきます。
Int(Rnd * 10) で 0 から 9 のランダムな整数(数値型)を生成し、 Str 関数で String 型に変換しています。
また、 String 型に変換する際にスペースが入ってしまう仕様のようなので Trim 関数でスペースを取り除きます。

ランダムな整数の文字列を生成する関数を作ってみよう

任意の桁数のランダムな整数を生成する方法が分かったら、これをもっと手軽に利用できるようにしたいですよね。
そんな時は関数を作ればいいのです。

ExcelVBA の関数は、Excel のマクロ内だけでなく Excel シート上でも使えます。

ここでは任意の桁数を渡すとランダムな整数の文字列が生成される関数を作っていきます。
関数名は randomNumString とします。(好きな名前で作ってください)

Function randomNumString(length As Integer) As String
    Dim randomString As String
    Dim i As Integer

    Randomize
    For i = 1 To length
        randomString = randomString & Trim(Str(Int(Rnd * 10)))
    Next i

    randomNumString = randomString
End Function

これを ExcelVBA の他のプロシージャや関数内で呼び出す場合は次のようにします。

Sub example7()
    Dim randomNum As String
    randomNum = randomNumString(50)

    Debug.Print randomNum
End Sub

Excel シート上で使用する場合は次のようにします。

関連の記事

ExcelVBAでランダムな文字列を生成する方法

ExcelVBA で時間が正しく変換されない

Excel のセルに名前を付けよう

OpenPyXl でチェックボックスを押したい