« 最大と最小 | トップページ | 回文判定マクロ »

2011年3月12日 (土)

2次元配列をランダムに並び換える

以前の記事「ランダムに並び替える 」では
セルの内容を乱数を使ってランダムに並び換えました。

今回は配列をランダムに並び換えたいと思います。

上記の記事の方法でも
配列を一回セルに出力してから
ランダムに並び換えて
再び配列に格納するという手順で可能です。

今回は配列のままランダムに並び換えたいわけですが、
考え方はセルの内容をランダムに並び換えるときと同じです。

あるランダムに並べ換えたい2次元配列vDataがあるとします。
vDataのサイズはUbound(vData)行、Ubound(vData, 2)列です。

そこでvDataに1列足したもう1つの配列vData2を作ります。
サイズはUbound(vData)行、Ubound(vData, 2)+1列です。
vData2の1列足した列に乱数を入れて
その列を基準に昇順か降順にソートします。

足した列を削除したものを
元の配列vDataに入れれば
vDataをランダムに並び換えたものになります。

下のコードの説明をします。

aからjまでのアルファベットを順番に入れた配列vDataを
ランダムに並び替えます。

結果を見るために
最後にセルに配列の内容を出力しています。

コードはこちら

配列をランダムに並び換えるコード:

Sub macro110312a()
'2次元配列をランダムに並び替える

    Sheets.Add
    Dim i As Integer
   
    '並び替えたい配列を作る
    'aからjまでの文字
    Dim vData() As Variant
    ReDim vData(10, 1)
    For i = 1 To 10
        vData(i, 1) = Chr(96 + i)
    Next i
   
    Dim vData2 As Variant
    vData2 = vData
    '一列足す
    ReDim Preserve vData2(UBound(vData), UBound(vData, 2) + 1)
   
    '足した列に乱数を入れる
    Randomize
    For i = 1 To UBound(vData2, 1)
        vData2(i, UBound(vData, 2) + 1) = Rnd()
    Next i
       
    '配列vData2を
    '1UBound(vData, 2) + 1列目を基準に降順にソートする
    Call BubbleSort3(vData2, UBound(vData, 2) + 1, 1)
   
    '足した列を削除する
    ReDim Preserve vData2(UBound(vData), UBound(vData, 2))
   
    '並び替えた配列を元の配列に入れる
    vData = vData2
   
    'ランダムに並び換えた配列を出カ
    Range("A1").Resize(UBound(vData), UBound(vData, 2)) = vData
   
End Sub

実行後のシートの例:
Vba20110312a

ここではvDataという配列を作成してから
ランダムに並び替えていますが、
すでに配列がある場合は
vDataにその配列を当てはめて考えてください。

タイトルにあるように
vDataには2次元配列を想定しています。

|

« 最大と最小 | トップページ | 回文判定マクロ »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 2次元配列をランダムに並び換える:

« 最大と最小 | トップページ | 回文判定マクロ »