二次元配列をランダムに並び替えたい
ランダムに並び替えるのに、特に難しい処理をしているわけではありません。
下記手順で並び替え可能です。
①二次元配列の列を一つ増やす。
②Rnd関数でランダムな値(乱数)を入れる。
③①の増やした列で並び替える。
④二次元配列を再定義する
’2次元配列をランダムに並び替えるパーツ(サブプロシージャ) Public Function Call_RandomSort2D(tmp As Variant) As Variant Dim i As Long Dim tmpCol As Long: tmpCol = UBound(tmp, 2) + 1 '■列を一つ増やす ReDim Preserve tmp(UBound(tmp), tmpCol) '■増やした列に乱数(ランダムな値)を入れる Randomize For i = 1 To UBound(tmp) tmp(i, tmpCol) = Rnd() Next i '■増やした列でソートする Call ArraySort(tmp, tmpCol, True) '■足した列を削除する ReDim Preserve tmp(UBound(tmp), tmpCol - 1) '■並び替えた配列を返す Call_RandomSort2D = tmp End Function
実際の使い方
Public Sub sample() Dim sample As Variant ReDim sample(1 To 3, 1 To 2) sample(1, 1) = "あ" sample(1, 2) = 1 sample(2, 1) = "い" sample(2, 2) = 2 sample(3, 1) = "う" sample(3, 2) = 3 sample = Call_RandomSort2D(sample) End Sub
注意点
- 上記コードのみでは動きません。別途パーツ化されたソートの処理も一緒にコピペしてください。
「二次元配列で任意の列をキーにソート(並び替え)」をパーツ化する【ExcelVBA】
関連記事
範囲を指定して乱数を発生させる【Rnd関数/Int関数】【ExcelVBA】
重複しないランダムな数値を生成する処理をパーツ化する【Rnd関数】【配列】【ExcelVBA】
コメント
11行目For i = 1 To tmpCol ではなく For i = 1 To Ubound(tmp)では?
ご指摘ありがとうございます。修正しました。