【VBA】乱数を発生させるマクロ【超簡単】

VBA

乱数を発生させるだけなら非常に簡単ですが、範囲を指定した乱数の作成方法や、整数での乱数方法等をまとめました。
また、コピペで使用できるように完成したマクロも掲載していますので、ご活用ください。

スポンサーリンク

乱数を発生させる完成したマクロ

マクロの説明

上記のエクセルデータには2つのプロシージャが準備されています。

1つ目:乱数を発生させるFunctionプロシージャ
    引数1 min:乱数の最小値
    引数2 max:乱数の最小値

2つ目:任意の選択したセルに乱数を代入するマクロ(Subプロシージャ)になっています。
    このマクロは1つ目に値を渡して乱数を代入していますので、1つ目のFunctionプロシージャが必要になります。

乱数を発生させるマクロの作り方

必須:仕様を決める。

マクロを作成する際自然とやっていると思いますが、この部分があいまいだとどうするんだったっけ?と混乱することがあるので、しっかりとどういう手順で作成するか考えましょう。

今回作成したマクロは下記の機能を実装しようと思って作成しました。

Function randint(min as Long, max as Long)
    'digit = 桁数
    '乱数を何倍するか
    'minとmaxの間の値が出るまでランダム繰り返す
End Function

sub 乱数生成()
    '乱数を代入するセルを選択してもらう
    '最小値と最大値の取得
    '最小値が最大値を上回っていたら終了
    '各セルへの乱数の代入
End Sub

必須:桁数を決める。(引数として受け取る)

乱数自体はRnd()関数で一発で発生させることができます。
しかし値が0~1の間なので0.15024614みたいな数値なんですよね。
何倍して、整数を作成するかを決めないといけません。
今回は引数maxを使って桁数を決めます。

    Dim digit As Long
    'digit = 桁数
    digit = 1
    
    '乱数を何倍するか
    For i = 1 To Len(Str(max))
        digit = digit * 10
    Next i

Len(Str(max))は、
・maxが10000だとしたら5を返します。
・maxが1000だったら4を返します。
このかえって来た回数だけdigitに10をかけることによって何倍にするかを決めています。

必須:乱数を発生させる。(関数で一発)

上記の桁数を決めるというところで乱数の発生方法をさらっと説明しましたが、そのまんまです。下記のコードで乱数を生成することがで来ます。

また、Do~Loopを使用して、条件が満たされるまで繰り返すことで、指定範囲内の乱数を取得できるようにしています。

'minとmaxの間の値が出るまでランダム繰り返す
    Do Until randint > min And randint < max
        randint = Round(Rnd() * digit, 0)
    Loop

乱数を発生させるための初期設定と代入方法

レンジを選択してもらう方法

これはInputBoxではなく、Application.InputBoxで対応できます。
通常のInputBoxではRangeを選択することができません。

また、Application.InputBox の引数でType:=8がRangeを表しています。
また、Rangeですので、Setを使って変数に代入することを忘れないようにしてください。

 '乱数を代入するセルを選択してもらう
        Set target = Application.InputBox("乱数を入力したいセルを選択してください", "セルの選択", Selection.Address, Type:=8)
        If target Is Nothing Then
            Exit Sub
        End If

今回はtargetという変数に代入していますが、もしキャンセルボタンを押した場合はまだ何もセットされておらず、エラーが返ってきます。
キャンセルを押した場合はマクロを中止するためのプログラムを実行することができないので、On Error Resume Nextでエラーを無視するプログラムを記述しています。

最大値と最小値を取得する。

これは普段使用しているようにInputBoxを使用して値を取得しています。

'最小値と最大値の取得
        min = InputBox("乱数の最小値を入力してください", "乱数の最小値")
        max = InputBox("乱数の最大値を入力してください", "乱数の最大値")
        
        '最小値が最大値を上回っていたら終了
        If min > max Then
            Exit Sub
        End If

最小値が最大値よりも大きくなってしまうと、乱数生成の際に無限ループが発生してし

For Each Rng In target
Rng.Value = randint(min, max)
Next Rng

まいます。これを回避するために最小値が最大値を超えるような場合もマクロを終了するようにプログラムしています。

各セルへの値の代入

これはFor Each文を使用して、セルの個数分、繰り返し乱数を生成するrandintプロシージャを実行するプログラムを記述しています。

For Each Rng In target
        Rng.Value = randint(min, max)
    Next Rng

完成したコード

冒頭に完成したコードが乗ってあるエクセルファイルがありますが、コードの一部だけ使用したい方もいると思うので、乗せておきます。
活用して下さい。

Function randint(min As Long, max As Long)
    Dim digit As Long
    'digit = 桁数
    digit = 1
    
    '乱数を何倍するか
    For i = 1 To Len(Str(max))
        digit = digit * 10
    Next i
    
    'minとmaxの間の値が出るまでランダム繰り返す
    Do Until randint > min And randint < max
        randint = Round(Rnd() * digit, 0)
    Loop
    
End Function

Sub 乱数生成()
    Dim target As Range
    Dim min As Long
    Dim max As Long
    On Error Resume Next
        '乱数を代入するセルを選択してもらう
        Set target = Application.InputBox("乱数を入力したいセルを選択してください", "セルの選択", Selection.Address, Type:=8)
        If target Is Nothing Then
            Exit Sub
        End If
        
        '最小値と最大値の取得
        min = InputBox("乱数の最小値を入力してください", "乱数の最小値")
        max = InputBox("乱数の最大値を入力してください", "乱数の最大値")
        
        '最小値が最大値を上回っていたら終了
        If min > max Then
            Exit Sub
        End If
        
        
    On Error GoTo 0
    '各セルへの乱数の代入
    For Each Rng In target
        Rng.Value = randint(min, max)
    Next Rng
End Sub

大した行数ではないですが、説明が長くなってしまいました。
取り合えず、読まなくても直面している問題を解決できるように冒頭にデータを乗せましたが、解決したでしょうか?
参考になれば幸いです笑

乱数を発生させるマクロの使い道

そもそも乱数の使いどころってなんかあるの?って話ですよね。
ゲームとかならめちゃくちゃありそうですが、業務であるのか?って話ですよね笑

乱数は主に開発段階で使用するものですね。
後は席替えとかくじ引きとか?笑

疑似データを作成するのに使用

乱数の使い方の一つとして、ランダムの顧客リストを作成したいと仮定します。こういう時にまず、氏のセル、名のセルをわけてざっくり10個ほど名前を入力します。あとはセルの番地を無作為に選択して氏名を作成するのに使ったりできます。

配列からランダムに取り出すときに使用

配列からランダムに値を取り出したい時にも今回作成した乱数生成昨日は役に立ちます。配列のインデックス番号の範囲内で乱数を生成することができるからです。

Sub test()
    Dim arr() As Variant
    arr = Array("リンゴ", "ゴリラ", "ラッパ", "パンツ", "積み木")
    Debug.Print arr(randint(0, UBound(arr) + 1))
End Sub

こんな感じですね。

まとめ

久しぶりにマクロを作成しました笑
次はランダム名前自動生成マクロを作成してみようかなと思います。笑
結構簡単なコードになりそうです笑

コメント

タイトルとURLをコピーしました