配列(一次元/二次元)

二次元配列をランダムに並び替える処理をパーツ化する【Rnd関数】【ExcelVBA】

二次元配列をランダムに並び替えたい

ランダムに並び替えるのに、特に難しい処理をしているわけではありません。
下記手順で並び替え可能です。

①二次元配列の列を一つ増やす。
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

注意点

関連記事

範囲を指定して乱数を発生させる【Rnd関数/Int関数】【ExcelVBA】
重複しないランダムな数値を生成する処理をパーツ化する【Rnd関数】【配列】【ExcelVBA】

コメント

  1. 11行目For i = 1 To tmpCol ではなく For i = 1 To Ubound(tmp)では?

    • ご指摘ありがとうございます。修正しました。

タイトルとURLをコピーしました