Dictionary の Value にオブジェクトを格納する
通常の Dictionary は「キー → 値」のペアを管理しますが、値に オブジェクト を入れることもできます。これを使うと「顧客コード → 顧客情報クラス」「商品コード → 商品オブジェクト」など、複雑なデータをまとめて扱えるようになります。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- Dictionaryの値にはオブジェクトも格納可能
dict("キー") = オブジェクト
- 取り出すときはオブジェクトとして扱う
Set obj = dict("キー")
- 用途:
- 顧客情報や商品情報をまとめて管理。
- クラスを使ったオブジェクト指向的な処理。
テンプレ1:オブジェクトを格納して取り出す
Sub Dict_ValueObject_Basic()
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim rng As Range
' Rangeオブジェクトを格納
Set rng = Worksheets("Data").Range("A1:A10")
dict("範囲1") = rng
' 取り出して操作
Dim r As Range
Set r = dict("範囲1")
MsgBox "範囲のセル数=" & r.Count
End Sub
VB- ポイント:
- 値に
Rangeオブジェクトを格納。 - 取り出すときは
Setを使う。
- 値に
テンプレ2:クラスオブジェクトを格納
まず、顧客情報を表すクラスを作成します。
クラスモジュール Customer
Public Name As String
Public Age As Integer
Public City As String
VBDictionaryに格納するコード
Sub Dict_ValueObject_Class()
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim cust As Customer
' 顧客A
Set cust = New Customer
cust.Name = "山田太郎"
cust.Age = 30
cust.City = "東京"
dict("C001") = cust
' 顧客B
Set cust = New Customer
cust.Name = "佐藤花子"
cust.Age = 25
cust.City = "大阪"
dict("C002") = cust
' 出力
Dim key As Variant
For Each key In dict.Keys
Set cust = dict(key)
Debug.Print key, cust.Name, cust.Age, cust.City
Next key
End Sub
VB- 結果:
C001 山田太郎 30 東京 C002 佐藤花子 25 大阪
テンプレ3:複数オブジェクトを格納して操作
Sub Dict_ValueObject_Multi()
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim ws As Worksheet
' 複数シートを格納
Set ws = Worksheets("Data")
dict("DataSheet") = ws
Set ws = Worksheets("Summary")
dict("SummarySheet") = ws
' 出力
Dim k As Variant
For Each k In dict.Keys
Debug.Print k, dict(k).Name
Next k
End Sub
VB- ポイント:
- 値に
Worksheetオブジェクトを格納。 - キーで呼び出して操作可能。
- 値に
テンプレ4:オブジェクトを使った集計処理
Sub Dict_ValueObject_Aggregate()
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim rng As Range
' 商品コードごとに範囲を格納
Set rng = Worksheets("Data").Range("C2:C10")
dict("P001") = rng
Set rng = Worksheets("Data").Range("D2:D10")
dict("P002") = rng
' 合計計算
Dim key As Variant
For Each key In dict.Keys
Debug.Print key, WorksheetFunction.Sum(dict(key))
Next key
End Sub
VB- ポイント:
- 値に
Rangeを格納しておけば、キーごとに集計可能。
- 値に
例題で練習
'例1:Rangeオブジェクトを格納
Sub Example1()
Dict_ValueObject_Basic
End Sub
'例2:クラスオブジェクトを格納
Sub Example2()
Dict_ValueObject_Class
End Sub
'例3:複数シートを格納
Sub Example3()
Dict_ValueObject_Multi
End Sub
'例4:Rangeオブジェクトで集計
Sub Example4()
Dict_ValueObject_Aggregate
End Sub
VB初心者向けポイント
- 値にオブジェクトも入れられる → RangeやWorksheet、クラスなど。
- 取り出すときは必ず
Set→ 値がオブジェクトだから。 - クラスを使うと柔軟 → 顧客情報や商品情報をまとめて管理できる。
- 実務で便利 → シートや範囲をキーで管理、顧客コードごとにオブジェクトを紐づけ。
👉 この「Valueにオブジェクトテンプレ」を覚えておけば、Dictionaryを使った オブジェクト管理・顧客情報管理・範囲集計 をExcel VBAで柔軟に実現できます。
