二次元配列をランダムに並び替えたい
ランダムに並び替えるのに、特に難しい処理をしているわけではありません。
下記手順で並び替え可能です。
①二次元配列の列を一つ増やす。
②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)では?
ご指摘ありがとうございます。修正しました。