1. はじめに
ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。
今回のテーマは「Dictionary(連想配列)オブジェクト」です。
こちらの記事 でもマクロの処理高速化について触れましたが、Dictionary を使用することで処理時間を大幅に短縮できる場合があります。
利用できるケースは限られますが、大量のデータから重複を削除したり、検索する処理などで真価を発揮します。
参考:この動画の例では 43.9秒 かかっていた処理が 0.18秒 に!(YouTube)
https://youtu.be/T4xBtySs-oQ?si=MWs-fGsE9rNFMSCe
2. Dictionary(連想配列)オブジェクト とは
ざっくりいうと、インデックス(添え字)を自由に決められる配列です。
キー・バリュー形式といえばわかりやすい方もいるでしょうが、事前に Key とそれに紐づく Item (Value やないんかい)を Dictionary に登録しておくと、Key を指定して Item を取得できます。
3. Dictionary の主な使い方
以下、dicという Dictionary に、変数keyの値を Key、変数itemの値を Item として紐づける例を紹介します。
3-1 宣言
'例1:Microsoft Scripting Runtime を参照設定する場合
Dim dic As New Dictionary
'例2:Microsoft Scripting Runtime を参照設定しない場合
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
コメントに記載の通りですが、前者の宣言を使用する場合には、事前に参照設定が必要です。Excel 起動後に「Alt」+「F11」でVBE(VBAのソースを記述する画面)を起動し、「ツール」-「参照設定」から、「Microsoft Scripting Runtime」のチェックを入れ「OK」を押下します。


後者のCreateObject("Scripting.Dictionary")を使用すればこの参照設定は不要ですが、処理速度は下がります。
参考:事前バインディングと実行時バインディング(外部記事)
https://excel-ubara.com/excelvba4/EXCEL227.html
3-2 Key, Item ペアの追加
If Not dic.Exists(key) Then
dic.Add key, item
Else
MsgBox k & "が重複しています。"
End If
Add メソッドを使用することで、Key, Item ペアを追加できます。ただし、既に登録済みの Key を指定すると、Item を上書きしてしまいます。
Existsメソッドを使用することで、Key の登録有無を True / False で判定できるので、上の例のように If 文で上書きを回避できます。
また Key と Item は一対一対応ですが、Item に配列を指定して複数の値を利用するような使い方もできます。
3-3 アイテムの取得
With Worksheets("Sheet1")
i = 0
For Each key In dic
i = i + 1
.Cells(i, 1).Value = key
.Cells(i, 2).Value = dic.Item(key)
Next
End With
この例では Sheet1 のA列に dic の Key、B列に Item を出力します。
key に紐づく Item は、Item プロパティを使用して、dic.Item(key) のように取得できます。
また、Dictionary の Key や Item を取得する際には、上の例のように 「For Each…Next」 を使用すると高速に処理できます。
3-4 Key, Item ペアの削除
'Key を指定して Item と共に削除
dic.Remove key
'Key, Item ペアをすべて削除
dic.RemoveAll
5. おわりに
以上、Dictionaryの解説でした。
今回触れなかったメソッドやプロパティもありますが、基本的には以上の内容で事足りるかと思います。
最後に注意点ですが、Dictionaryの使い方次第では思ったほどのパフォーマンスが出ない場合もあります。以下の記事で詳しく紹介されていますが、今回触れなかった Keys, Itemsメソッドを使用する際には注意が必要です。
6. 参考文献
こちらはMicrosoftの公式ドキュメントです。今回触れなかったメソッドやプロパティはこちらからご参照ください。
上でも引用した「エクセルの神髄」という解説サイトのページ。より深く学習を進めたい方は是非。