作成者向けマクロ

ランダムな順で並べ替える

サンプル用のデータで不規則なデータを考えるのが面倒なので、
もう少し楽にできないかなと考えて作ってみました。

A列の値をランダムに並べ替えてB列に表示するマクロです。

サンプルコード



Sub ランダムな順で並べ替え()

Dim LastRow As Long     '全体の行数
Dim lngRnd As Long     '1〜行数までのランダムな数
Dim aryData() As String   '並べ替え後の値
Dim checkAry() As Boolean  'インデックスNoの値がすでに出たかのチェックフラグ
Dim i As Long
Dim ii As Long       'aryDataのインデックス番号

With ThisWorkbook.Worksheets(1)
  ii = 1
  LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
  
  '◆入替用の配列作成
  ReDim aryData(1 To LastRow, 1 To 1)
  ReDim checkAry(1 To LastRow)
  
  '◆行数分だけ繰り返し
  For i = 1 To LastRow
    '◆今までに出てない数値が出るまで繰り返し
    Do
      Randomize
      lngRnd = Int(Rnd * LastRow) + 1
    Loop Until checkAry(lngRnd) = False
    
    '◆値を配列に格納してチェックフラグをTrueにする
    aryData(ii, 1) = .Cells(lngRnd, "A").Value
    checkAry(lngRnd) = True
    ii = ii + 1
  Next i
  
  '◆B列に並べ替え後の値を書き出し
  .Range(.Cells(1, "B"), .Cells(LastRow, "B")).Value = aryData
End With
End Sub


使用例


こんな感じになります。
ランダムな順で並べ替える01

解説


Rnd関数はヘルプの説明をみてもさっぱりわからなかったので
重複しないランダムな数を取得する方法はmorgの即効テクニックを参考に作りました。
重複を許可せず、ランダムな数をセルに代入する

向こうのページにはコードだけで解説はまったくないので、わかる範囲で解説してみます。

すでに出た値かどうかはBoolean型の配列を作成して、その値でチェックしています。
たとえば、このサンプルでいうと配列checkAryです。

1行目〜最終行まで入れ替えを行いたいので、checkAryの要素数は最終行と同じにしています。
ただし、最終行が何行目かは、変数宣言時にはわかりません。

そこで、宣言時には要素数を指定しないでおいて、最終行が決まった段階で、
ReDimステートメントで配列を定義しなおしています。
(こういう配列のことを動的配列といったりします)

最終行が10行目の場合、以下のような配列が作成されます。
checkAry(1)
checkAry(2)
checkAry(3)
・・・
checkAry(10)

値はすべてFalseが入ってます(Boolean型の初期値)

Int(Rnd * LastRow)で0〜LastRow-1までのランダムな値が作られるので、
それに1を加算しています。

その値が1の場合checkAry(1)をTrue、2の場合はcheckAry(2)・・・・・・と
その値が出たらその数値のインデックス番号の値をTrueをにしています。

つまり
checkAry(1) False
checkAry(2) True
checkAry(3) True

なら1はまだ出ていない、2と3は出た、という意味になります。

重複しない数が出るまで繰り返すには、Do...Loopステートメントを使います。
Untilを後に持ってくることで、1回目は無条件に実行、
2回目以降は条件を満たすまで繰り返しています。

ランダムな値が取得できたら、あとはその行番号の値を順番に配列に格納していきます。
値が1つだけなので1次元配列で

aryData(1) 値1
aryData(2) 値2
aryData(3) 値3

としてもいいのですが、あとでセルに書き込むとき、1つ1つ順番に書き込むより
配列から一気にセル範囲に書いたほうが速いのでわざと2次元配列にしています。

あとはB列に2次元配列から値を書き込んで終了です。

Powered by Seesaa
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。