エクセルバージョン
マイクロソフト365
本日はエクセルVBAで重複しない乱数の作成と指定範囲をランダムに並び替えを実施してみたいと思います。
それではいってみましょう(*´∀`)
Menu
乱数の初期化
Randomize ステートメント
Rnd関数の乱数ジェネレーターを初期化します。
乱数を作成する際は下記の1文を記述します。
Randomize
乱数の作成
まずは今回の要となる乱数を取得しないといけないので、下記1文で乱数を作成します。
Int((上限値 – 下限値 + 1) * Rnd + 下限値)
それでは次にVBAで実際に記述していきます。
VBAサンプル
今回は乱数系で、きっと悩まれるであろう2パターンをご紹介していきたいと思います(*^^)v
➀単純に重複しないランダムな数値を作成
➁指定範囲を重複なしのランダムに並び替える
コピペで即、試せますので是非実行してみてください(*゚▽゚)ノ
実行方法が分からない場合 → マクロ実行方法
数を指定して重複しないランダムな数字を作成
定数のMAXINTを変更すれば、作成したい乱数の数を指定できます(初期値は5)
A列に1~5の重複しないランダムな数字が作成されます。
全てコピペ(*゚▽゚)ノ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | Option Explicit '定数 Const MAXINT As Integer = 5 '作成したい乱数の数を指定 Const COL As Integer = 1 '作成したい列番号を指定 Sub 重複しない乱数作成() '変数 Dim i, rndInt, ary() As Integer 'データ消去 Columns(COL).ClearContents 'データ作成 For i = 0 To MAXINT - 1 ReDim Preserve ary(i) ary(i) = i + 1 Next '乱数初期化 Randomize '繰り返し処理(For~Next) For i = 1 To UBound(ary) '乱数=Int((最大値 - 最小値 + 1) * Rnd + 最小値) rndInt = Int((UBound(ary) - LBound(ary) + 1) * rnd + LBound(ary)) 'セルに書き込む Cells(i, COL) = ary(rndInt) '書込みした配列を末尾の配列の値で上書き ary(rndInt) = ary(UBound(ary)) '末尾の配列を1つ削除 ReDim Preserve ary(UBound(ary) - 1) '最後の値を書き込む If UBound(ary) = 0 Then Cells(i + 1, COL) = ary(0) Exit Sub End If Next End Sub |
【実行後】
指定したデータ数の重複しないランダムデータが作成されます\(^^)/
【解説】
こちらの考え方は下記になります。
➀乱数作成
②書き込んだ配列要素を末尾の配列要素で上書き
これを配列分繰り返すことにより配列が1つずつ削除されて重複しないデータができあがります。
いたってシンプルな考え方だと思います(^O^)
これは私には難しい!という方下記のようなやり方もあります。
関数やRPAで30秒で作成したい場合は
指定範囲を重複なしのランダムに並び替える
指定範囲を並び替えると元データがなくなってしまうので、今回はA列のデータをB列にランダムに並び替えしたいと思います。
定数で開始行と列を指定できます。
全てコピペ(*゚▽゚)ノ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | Option Explicit '定数 Const STARTROW As Integer = 1 'データの開始行を指定 Const DATACOL As Integer = 1 'データの列を指定 Sub 指定範囲をランダムに並び替える() '変数 Dim lastRow, dataCnt, rowNum, i, rndNum, cnt, dataAry() As Integer Dim dataRange As Range '最終行番号取得 lastRow = Cells(Rows.Count, DATACOL).End(xlUp).Row 'データ数取得 dataCnt = lastRow - STARTROW + 1 'データ範囲(可変式) Set dataRange = Range(Cells(STARTROW, DATACOL), Cells(lastRow, DATACOL)) dataRange.Select 'データ消去 Columns(DATACOL + 1).ClearContents '再定義して配列数を変更して配列要素を全て0にする ReDim dataAry(STARTROW To lastRow) As Integer '乱数初期化 Randomize 'データ分、繰り返す For i = 0 To dataCnt - 1 '乱数を作成して配列要素が1の間はループさせ重複しないようにする Do rndNum = Int(Rnd * dataCnt) + STARTROW '乱数生成 cnt = cnt + 1 '永久ループ回避 If cnt >= dataCnt * 10 Then Exit Sub End If Loop While dataAry(rndNum) = 1 'セルに書込み Cells(i + 1, DATACOL + 1) = Cells(rndNum, DATACOL) 'セルに書き込んだ配列要素を1にする dataAry(rndNum) = 1 Next End Sub |
【実行後】
A列の元データからB列に重複しないようにランダムに並び替えができます\(^^)/
【解説】
まずはデータ範囲の指定をします。
今回の重複しないランダムな並び替えの考え方は下記になります。
➀乱数作成
➁書込みしたら配列要素を1にする
➂すでに書き込まれた値(配列要素が1)だったらループさせて書き込まない
この1連の処理で重複させずにランダムに並び変わります。
【応用】
まとめ
これで何か重複なしのランダムデータを作成したい場合、今回のコードを参考にして頭をフル回転させて考えれば何でも作成できます(^^)
今回は乱数系できっと作成時に悩まれるであろうパターンを2つVBAサンプルで作成してみました。
乱数はその他にも作成の方法がありますが今回の方法が一番簡単だと思うので、忘れた場合はコピペしてご自身でデバッグして動きを確認してみてください。
以上です。