順番をランダムに入れ替える

Excel でやりたいことの前段として、以下が必要になった。

  • ある範囲の順番を、ランダムに入れ替える。

そこでまずは、「順番だけ」をランダムに入れ替える。
取り敢えず今回は、辞書(連想配列)を用いてこれを行った。

<おさらい>
連想配列はKeyとItemから成っていて、Keyの重複を許さない。

Function ShuffledOrderDict() As Dictionary
    Dim iMax As Long
        iMax = Selection.Count
    Dim Dict As Dictionary
    Set Dict = New Dictionary
    Dim i As Long
        For i = 1 To iMax
            Do
                Dim TempNumber As Long
                    TempNumber = Rnd * (iMax + 1)
                    If TempNumber >= 1 And TempNumber <= iMax And _
                       Dict.Exists(TempNumber) = False Then
                        Dict(TempNumber) = i
                        Exit Do
                    End If
            Loop
        Next
    
    Dim Dict2 As Dictionary
    Set Dict2 = New Dictionary
    Dim myKey As Variant
    For Each myKey In Dict.Keys
        Dict2(Dict(myKey)) = myKey
    Next
    
    Set ShuffledOrderDict = Dict2
        
End Function

重複NGがKeyであるため、並び替え後の順序を一旦keyとしている。その後に、keysとitemを入れ替えることで、

  • 辞書(元の順序)=ランダムに並び替えた後の順序

を作成した。

確認した結果がこちら。
f:id:Infoment:20181210063731p:plain

今は未だ「iMax」の部分が選択範囲に対しての処理だが、ここを引数にすれば、何とかなりそうだ。

次回に続きます。

参考まで。