和風スパゲティのレシピ

日本語でコーディングするExcelVBA

DictionaryのKey/Itemを配列(Array)に変換する

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は二つの一次元配列にしていた方がいい場面は多そうですが、
セットで一つの配列にする必要があればこちらのコードを利用してください。