辞書には配列を入れることもできるし、辞書を配列にすることもできる

今日は、辞書(Dictionary)について気づいたお話。
f:id:Infoment:20210211204020p:plain

辞書には、色んなものが入る。例えば、配列も入れられる。
例えば、毎度おなじみ「なんちゃって個人情報」にて。
f:id:Infoment:20210211204137p:plain

名前をキーにして、各行を配列に格納したのち、それをアイテムにしてみる。

Sub Test()
    
    ' 辞書。
    Dim Dict As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    
    ' テーブルのデータ範囲を全て、一旦配列に格納。
    Dim arr As Variant
        arr = ActiveSheet.ListObjects(1).DataBodyRange
        
    ' 各行(レコード)について、
    '  キー  :名前
    '  アイテム:レコード単位でスライスされた配列
    ' で辞書を作成する。
    Dim i As Long
        For i = 1 To UBound(arr)
            Dict(arr(i, 2)) = WorksheetFunction.Index(arr, i, 0)
        Next
        
    ' 山上 美紀さんのレコードの7列目(つまり誕生日)を表示。
        MsgBox Dict("山上 美紀")(7)
        
End Sub

果たして結果は、ご覧のとおりだ。
f:id:Infoment:20210211204311p:plain

とここで、ふと思いついた。ひょっとして、辞書を配列にもできる?
早速試してみた。

まず、テーブルのラベル名で列挙体を作成する。

Enum 列名
    enNo = 1
    en名前
    enふりがな
    enアドレス
    en性別
    en年齢
    en誕生日
    en婚姻
    en都道府県
    en携帯
    enキャリア
    enカレーの食べ方
    [_eLast]
End Enum

次いで、ラベル数に応じた辞書の配列を作成し、名前をキーとして
各アイテムをセットする。

Private Function 個人情報(column_index As Long) As Scripting.Dictionary
    Dim Dict(列名.enNo To 列名.enカレーの食べ方) As Scripting.Dictionary
    Dim i As Long
        For i = 列名.enNo To 列名.enカレーの食べ方
            Set Dict(i) = New Scripting.Dictionary
        Next
    Dim j As Long
    Dim arr As Variant
        arr = ActiveSheet.ListObjects(1).DataBodyRange
        For i = 1 To UBound(arr)
            For j = 列名.enNo To 列名.enカレーの食べ方
                Dict(j)(arr(i, 列名.en名前)) = arr(i, j)
            Next
        Next
        
    Set 個人情報 = Dict(column_index)
End Function

すると先程のメッセージボックスは、このようにして表示できる。

Sub test()
    MsgBox 個人情報(列名.en誕生日)("山上 美紀")
End Sub

個人的に、これはこれで面白いと思った。なお、使い処については
いつものように、時と場合とお好みで。

参考まで。