はじめに
VBAの配列は、myArray(0)
のように数値のインデックスでデータを管理します。しかし、「商品名」をキーにして「価格」を取り出す、といったように、文字列をキー(添え字)にしてデータを扱いたい場面は非常に多くあります。
このような「キーと値のペア」でデータを管理する仕組みを「連想配列」と呼びます。VBAで連想配列を実現するには、Scripting.Dictionary
オブジェクトを利用するのが最も強力で一般的です。
この記事では、Dictionary
オブジェクトの基本的な使い方から、実用的な応用例までを網羅的に解説します。
【事前準備】 Dictionary
を使うには、「参照設定」が必要です。VBEのメニューから「ツール」→「参照設定」を開き、「Microsoft Scripting Runtime」にチェックを入れてください。これにより、Dim dict As Dictionary
のように Dictionary
型を直接使えるようになり、入力補完も効くため便利です。
Dictionary
オブジェクトの基本的な使い方
1. Dictionary
の作成
' Dictionaryオブジェクトを宣言し、新しいインスタンスを作成する
Dim productPrices As Scripting.Dictionary
Set productPrices = New Scripting.Dictionary
2. 項目の追加 (.Add
)
.Add
メソッドを使って、「キー」と、それに対応する「値(Item)」をペアで追加します。キーは重複できません。
' .Add キー, アイテム
productPrices.Add "商品A", 1200
productPrices.Add "商品B", 850
productPrices.Add "商品C", 2100
3. 項目の値を取得
キーを指定して、対応する値を取得します。
' "商品B" の価格を取得
Dim price As Long
price = productPrices("商品B") ' または productPrices.Item("商品B")
MsgBox "商品Bの価格: " & price & "円" ' -> 850円
4. キーの存在確認 (.Exists
)
指定したキーが既に存在するかどうかを True
/False
で確認します。.Add
の前に重複をチェックする際に必須です。
If productPrices.Exists("商品D") Then
MsgBox "商品Dは既に登録されています。"
Else
productPrices.Add "商品D", 980
MsgBox "商品Dを追加しました。"
End If
5. 項目数の取得 (.Count
)
.Count
プロパティで、Dictionary
に格納されている項目数を取得できます。
MsgBox "登録されている商品数: " & productPrices.Count
キーと値の一覧を取得する
6. 全てのキーを取得 (.Keys
)
.Keys
メソッドは、Dictionary
内の全てのキーを格納した配列を返します。
Dim allKeys As Variant
allKeys = productPrices.Keys ' -> ("商品A", "商品B", "商品C", "商品D")
' Join関数と組み合わせて一覧表示
MsgBox "取扱商品一覧: " & Join(allKeys, ", ")
7. 全ての値(Item)を取得 (.Items
)
.Items
メソッドは、全ての値を格納した配列を返します。
Dim allPrices As Variant
allPrices = productPrices.Items ' -> (1200, 850, 2100, 980)
項目の削除
8. 特定の項目を削除 (.Remove
)
キーを指定して、項目を削除します。
productPrices.Remove "商品C"
MsgBox "商品Cを削除しました。"
9. 全ての項目を削除 (.RemoveAll
)
Dictionary
の中身を全て空にします。
productPrices.RemoveAll
MsgBox "全ての商品を削除しました。"
実用例:重複を除いたリストの作成
Dictionary
の「キーが重複できない」という特性は、重複を除いたユニークなリストを作成する際に絶大な威力を発揮します。
' D列の値から、重複を除いたリストを作成する
Sub CreateUniqueList()
Dim uniqueList As Scripting.Dictionary
Set uniqueList = New Scripting.Dictionary
Dim cell As Range
' D2セルからD列の最終行までループ
For Each cell In ActiveSheet.Range("D2", ActiveSheet.Cells(Rows.Count, "D").End(xlUp))
' まだキーとして登録されていなければ、追加する
If Not uniqueList.Exists(cell.Value) Then
uniqueList.Add cell.Value, "" ' 値は使わないので空でOK
End If
Next cell
MsgBox "重複を除いたリスト:" & vbCrLf & Join(uniqueList.Keys, vbCrLf)
End Sub
まとめ
今回は、VBAで連想配列を実現する Scripting.Dictionary
オブジェクトの網羅的な使い方を解説しました。キーと値のペアでデータを管理できるため、単純な配列よりも直感的で高速なデータアクセスが可能になる場面が多くあります。特に、重複チェックのロジックをシンプルに記述できる点は、実務において非常に強力です。