Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » 重複しないランダムな数値・乱数を作成するExcelマクロ

重複しないランダムな数値・乱数を作成するExcelマクロ

対象:Excel2003, Excel2007, Excel2010

乱数を発生させるマクロをご紹介しました。

For Each~Nextループ文の中でRnd関数を使って乱数を発生させているだけのシンプルなマクロです。

このマクロでは重複した値が生成される可能性がありますが、重複しないランダムな数値・乱数が欲しいということも、よくあります。

[スポンサードリンク]

重複しない乱数を作成するサンプルマクロ

そんなマクロをご紹介しておきます。

Sub 重複しない整数を入力する()

 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

End Sub

セルを選択しておいてから上記のマクロを実行すると、「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マクロ

「マクロのサンプル」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.