Dictionaryは「連想配列」と呼ばれるオブジェクトで、
KeyとItemをセットで持っておく仕組みです。

「IDと値のペア」というイメージですね。
もちろんこの王道の使い方でDictionaryは非常に便利なのですが、
Dictionaryのもう一つの使い方として、
「DictionaryをKeyだけの一次元配列として使用する」
というテクニックがあります。

「KeyをItemだと思って使う」と捉えてもいいかもしれません。
実はこの方法、Collectionの上位互換と言っていい性能であるため、
このテクニックを用いるとCollecitonをほとんど使用する必要がなくなります。
なかなか便利なテクニックですのでぜひとも活用してみてください。
基本コード
例えば「みかん、りんご、いちご、さくらんぼ、…」と、
データに登場した値を格納していくとします。
Collectionであれば、
Dim コレクション As New Collection コレクション.Add "みかん" コレクション.Add "りんご" コレクション.Add "いちご" コレクション.Add "さくらんぼ"
このコードで実装するような処理ですね。
これをDictionaryで行う場合は、以下のコードで実装します。
Dim ディクショナリ As New Dictionary ディクショナリ.Add "みかん", "" ディクショナリ.Add "りんご", "" ディクショナリ.Add "いちご", "" ディクショナリ.Add "さくらんぼ", ""
ほとんど変わらないコードで実装できていますね。
DictionaryはItemを省略することができませんので、
第二引数に""(かっこつけるならEmpty)を書く必要があるだけです。
「Itemをすべて""にして無視すれば、DictionaryをCollectionっぽく使用できる」
ことをまずは知っておきましょう。
CollectionとKeyのみDictionaryの比較
さて上記の2つのコードですが、もちろん性能には違いがあり、
以下の点でDictionaryが上位互換と言ってよい性能を誇ります。
- DictionaryはKeyの存在チェックが可能(IsExists)
- このためDictionaryはユニーク(重複なし)リストの生成が容易
- DictionaryはKeyを一次元配列に変換可能
どれも嬉しいアドバンテージですよね。
例えば「商品名(A列)を重複を無くして別シートに出力」するコードは、
Sub 商品名をユニークにして別シートに出力する() Dim ディクショナリ As New Dictionary Dim R As Long For R = 2 To WSデータ.UsedRange.Rows.Count If ディクショナリ.Exists(WSデータ.Cells(R, 1).Value) = False Then ディクショナリ.Add WSデータ.Cells(R, 1).Value, "" End If Next WS出力.Range("A1").Resize(ディクショナリ.Count) _ = WorksheetFunction.Transpose(ディクショナリ.Keys) End Sub
このように「Existsによる存在チェック」で簡単に書くことができ、
Keysで一次元配列に変換できるためセルへの出力も高速です。
(そのままでは横方向になるのでTRANSPOSE関数をかませます)
これをCollectionでやろうと思うと、存在チェック、配列変換の両者とも、
ForEach文を使って自作する必要があり相当面倒です。
このようにDictionaryのItemを無視し、KeyをItemだと思って運用すれば、
存在チェックと一次元配列変換を備えたCollectionとして活用することもできます。
ぜひともご活用ください。
Collectionが勝る点
今回のテクニックをメインロジックに採用するのであれば、
原則Collectionを使用しない方針でコーディングを進めて問題ありません。
最後にCollectionが勝っている点を記載しておきますので、
Dictionaryとの使い分けを考えてみてください。
まず一つ目、これはDictionaryでは逆にできない点ですが、
Collectionは重複した要素を格納することができます。
Dim コレクション As New Collection コレクション.Add "みかん" コレクション.Add "みかん" コレクション.Add "みかん"
重複を許してとにかく要素を格納していく場面ではCollectionを使用してください。
続いて二つ目、Dictionaryは標準搭載されたオブジェクトではないため、
使用するにはScripting Runtimeの参照設定が必要になります。
ただ、この設定は慣れれば10秒かかりませんので、
すべてのブックで参照していくつもりで、設定に慣れてしまうのをおすすめします。
最後に三つ目、Dictionaryはどうしても連想配列としての使用を想定してしまうので、
他の人がコードを読む際、第二引数の""の意味がくみ取りづらい側面があります。
自分だけが読むコードであれば全く問題ありませんが、
他の人も読む可能性がある場合は、ひとことコメントしてあげると親切ですね。
以上がCollectionが勝る数少ないポイントです。
Dictionaryとの使い分けの参考にしてみてください。