Excel VBA 逆引き集 | Valueにオブジェクト

Excel VBA
スポンサーリンク

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
VB

Dictionaryに格納するコード

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で柔軟に実現できます。

タイトルとURLをコピーしました