辞書には配列を入れることもできるし、辞書を配列にすることもできる
今日は、辞書(Dictionary)について気づいたお話。
辞書には、色んなものが入る。例えば、配列も入れられる。
例えば、毎度おなじみ「なんちゃって個人情報」にて。
名前をキーにして、各行を配列に格納したのち、それをアイテムにしてみる。
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
果たして結果は、ご覧のとおりだ。
とここで、ふと思いついた。ひょっとして、辞書を配列にもできる?
早速試してみた。
まず、テーブルのラベル名で列挙体を作成する。
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
個人的に、これはこれで面白いと思った。なお、使い処については
いつものように、時と場合とお好みで。
参考まで。