Dictionaryの中身を配列に変換する方法を紹介します。
Key、Itemをそれぞれ一次元配列にするだけなら、
Keysメソッド、Itemsメソッドを使用するだけでOKです。
KeyとItemをセットで二次元配列にしたい場合は、
動的配列を用いてひとつずつ代入していく必要があります。
Key/Itemを一次元配列に変換する
基本構文
Dim 一次元配列 As Variant ' Keyのリストを一次元配列に変換 一次元配列 = ディクショナリ.Keys ' Itemのリストを一次元配列に変換 一次元配列 = ディクショナリ.Items
サンプルコード
' Dictionaryのサンプル Dim Dic商品 As New Dictionary Dic商品.Add 101, "みかん" Dic商品.Add 102, "りんご" Dic商品.Add 103, "いちご" ' Keyを一次元配列に Dim Arr商品コード As Variant Arr商品コード = Dic商品.Keys ' ↑ Array(101, 102, 103)と同じものが生成される ' Itemを一次元配列に Dim Arr商品名 As Variant Arr商品名 = Dic商品.Items ' ↑ Array("みかん", "りんご", "いちご")と同じものが生成される
解説
DictionaryのKey/Itemを一次元配列に変換したい場合は、
DictionaryのKeysメソッド・Itemメソッドを使用するのが簡単です。
このコードを実行するだけで一次元配列を返してくれますので、
あとはVariant変数に代入してあげれば配列として使用できます。
注意点として、Keys/Itemsメソッドは配列に「変換」するメソッドです。
言い換えると「実行すると配列を生成する」メソッドです。
この仕様を理解した上で↓のコードを見てみてください。
Debug.Print Dic商品.Keys(0) ' 101が返ります Debug.Print Dic商品.Keys(1) ' 102が返ります Debug.Print Dic商品.Keys(2) ' 103が返ります
一見問題なくKeyを配列から取り出せているように見えますが、
↑のコードは3回配列を1から作り直しているコードです。
データが少なければそこまで影響はないかもしれませんが、
データ量が増えると極端な速度遅延が起きるコードになります。
基本構文のように一旦変数に代入することが必須ですので、
使用する際はこの仕様にご注意ください。
' これならOK Dim Arr商品コード As Variant Arr商品コード = Dic商品.Keys Debug.Print Arr商品コード(0) ' 101が返ります Debug.Print Arr商品コード(1) ' 102が返ります Debug.Print Arr商品コード(2) ' 103が返ります
配列のインデックス(添字)を1はじまりにしたい場合
上記のKeys/Itemsメソッドで生成できる配列は、
0はじまりの配列になっています。
LBoundが0、UBoundがディクショナリ要素数-1になるということですね。
残念ながらKeys/Itemsのこの仕様を変更する方法はありません。
※ Optional Base 1 ステートメントも反映されません。
配列の添え字を「1~要素数」にしたい場合は、
動的配列にひとつずつ代入してください。
' Dictionaryのサンプル Dim Dic商品 As New Dictionary Dic商品.Add 101, "みかん" Dic商品.Add 102, "りんご" Dic商品.Add 103, "いちご" ' Keyを一次元配列に Dim Arr商品コード() As Variant ReDim Arr商品コード(1 To Dic商品.Count) Dim key商品コード Dim i As Long: i = 1 For Each key商品コード In Dic商品.Keys Arr商品コード(i) = key商品コード i = i + 1 Next ' Itemを一次元配列に Dim Arr商品名() As Variant ReDim Arr商品名(1 To Dic商品.Count) Dim item商品名 Dim i As Long: i = 1 For Each item商品名 In Dic商品.Items Arr商品名(i) = item商品名 i = i + 1 Next
KeyとItemのペアを二次元配列にしたい場合
KeyとItemのペアを1行とする二次元配列にしたい場合は、
動的配列を用いてひとつずつ代入していきます。
' Dictionaryのサンプル Dim Dic商品 As New Dictionary Dic商品.Add 101, "みかん" Dic商品.Add 102, "りんご" Dic商品.Add 103, "いちご" ' Key&Itemを二次元配列に Dim Arr商品() As Variant ReDim Arr商品(1 To Dic商品.Count, 1 To 2) Dim key商品コード Dim R As Long: R = 1 For Each key商品コード In Dic商品.Keys Arr商品(R, 1) = key商品コード Arr商品(R, 2) = Dic商品.Item(key商品コード) R = R + 1 Next
上記のコードを実行すると、
| 101 | みかん |
| 102 | りんご |
| 103 | いちご |
という二次元配列が生成されます。
KeyとItemは二つの一次元配列にしていた方がいい場面は多そうですが、
セットで一つの配列にする必要があればこちらのコードを利用してください。