乱数を発生させるマクロをご紹介しました。
For Each~Nextループ文の中でRnd関数を使って乱数を発生させているだけのシンプルなマクロです。
このマクロでは重複した値が生成される可能性がありますが、重複しないランダムな数値・乱数が欲しいということも、よくあります。
重複しない乱数を作成するサンプルマクロ
そんなマクロをご紹介しておきます。
Dim rng As Range
Dim cnt As Long ' 選択されているセルの数
Dim num As Long
Dim flg() As Boolean
If TypeName(Selection) <> "Range" Then Exit Sub
cnt = Selection.Count
ReDim flg(1 To cnt)
Randomize
For Each rng In Selection
Do
num = Int(Rnd * cnt) + 1
If flg(num) = False Then
flg(num) = True
Exit Do
End If
Loop
rng.Value = num
Next
セルを選択しておいてから上記のマクロを実行すると、「1」から選択されているセルの個数までの整数が重複しないように入力されます。
サンプルマクロの解説
重複しない整数を作成しているのが
Do
num = Int(Rnd * cnt) + 1
If flg(num) = False Then
flg(num) = True
Exit Do
End If
Loop
の部分です。
Do Loopに入ってすぐ
num = Int(Rnd * cnt) + 1
で、ランダムな整数を作成して変数・numに格納します。
次にそのインデックス番号を持った配列・flgが「False」の場合に
If flg(num) = False Then
配列・flgを「True」にして
flg(num) = True
Do Loopを抜けています。
Exit Do
逆に言えば、そのインデックス番号を持った配列・flgが「True」である限り、Do Loopが繰り返され、重複した整数が作られないということになります。
実際にセルに値を入力するのはDoループ文を抜けた直後の
rng.Value = num
です。
セルが選択されていない場合にエラーとなってしまうのを避けるため
If TypeName(Selection) <> "Range" Then Exit Sub
で、選択されているのがセルでなければマクロを終了しています。
選択されているセルの個数をカウントして
cnt = Selection.Count
セルの個数を最大値とした配列・flgを準備しています。
ReDim flg(1 To cnt)
また、乱数を発生するときの定番処理
Randomize
をFor Each~Nextループに入る前に行っています。
Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » 重複しないランダムな数値・乱数を作成するExcelマクロ