Excel VBA 逆引き集 | Valueに配列

Excel VBA
スポンサーリンク

Dictionary の Value に配列を格納する

通常の Dictionary は「キー → 値」のペアを管理しますが、値に 配列 を入れることもできます。これを使うと「顧客コード → 複数の購入商品」「カテゴリ → 複数の属性」など、1つのキーに複数データを紐づけられます。初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • Dictionaryの値に配列を入れる
    • dict("キー") = Array(...) のように格納。
  • 取り出すときは配列として扱う
    • Dim arr As Variant: arr = dict("キー")
    • ループで要素を処理。
  • 用途:
    • 顧客ごとの購入商品一覧。
    • 商品カテゴリごとの属性。
    • 複数値をまとめて管理。

テンプレ1:キーに配列を格納して取り出す

Sub Dict_ValueArray_Basic()
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")

    ' 値に配列を格納
    dict("A001") = Array("りんご", "みかん", "バナナ")
    dict("A002") = Array("ぶどう", "もも")

    ' 取り出し
    Dim arr As Variant, i As Long
    arr = dict("A001")
    For i = LBound(arr) To UBound(arr)
        Debug.Print "A001の商品=" & arr(i)
    Next i
End Sub
VB
  • 結果: A001の商品=りんご A001の商品=みかん A001の商品=バナナ

テンプレ2:顧客ごとの購入商品リスト

Sub Dict_ValueArray_Customer()
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")

    dict("顧客A") = Array("りんご", "みかん")
    dict("顧客B") = Array("バナナ", "ぶどう", "もも")

    Dim cust As Variant, arr As Variant, i As Long
    For Each cust In dict.Keys
        Debug.Print "顧客=" & cust
        arr = dict(cust)
        For i = LBound(arr) To UBound(arr)
            Debug.Print "  商品=" & arr(i)
        Next i
    Next cust
End Sub
VB
  • 結果: 顧客=顧客A 商品=りんご 商品=みかん 顧客=顧客B 商品=バナナ 商品=ぶどう 商品=もも

テンプレ3:シートデータを読み込んで配列に格納

Sub Dict_ValueArray_FromSheet()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C10") ' A=顧客, B=商品, C=数量
    Dim v As Variant: v = rg.Value

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim r As Long, cust As String, prod As String

    For r = 1 To UBound(v, 1)
        cust = v(r, 1)
        prod = v(r, 2) & "(" & v(r, 3) & ")" ' 商品(数量)

        Dim arr As Variant
        If dict.Exists(cust) Then
            arr = dict(cust)
            ReDim Preserve arr(LBound(arr) To UBound(arr) + 1)
            arr(UBound(arr)) = prod
            dict(cust) = arr
        Else
            dict(cust) = Array(prod)
        End If
    Next r

    ' 出力
    Dim k As Variant, i As Long
    For Each k In dict.Keys
        Debug.Print "顧客=" & k
        arr = dict(k)
        For i = LBound(arr) To UBound(arr)
            Debug.Print "  商品=" & arr(i)
        Next i
    Next k
End Sub
VB
  • ポイント:
    • 顧客ごとに購入商品を配列にまとめる。
    • ReDim Preserve で配列を拡張。

テンプレ4:配列をJOINで文字列化して出力

Sub Dict_ValueArray_Join()
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")

    dict("カテゴリA") = Array("赤", "青", "緑")
    dict("カテゴリB") = Array("白", "黒")

    Dim k As Variant
    For Each k In dict.Keys
        Debug.Print k & " → " & Join(dict(k), ", ")
    Next k
End Sub
VB
  • 結果: カテゴリA → 赤, 青, 緑 カテゴリB → 白, 黒

例題で練習

'例1:キーに配列を格納
Sub Example1()
    Dict_ValueArray_Basic
End Sub

'例2:顧客ごとの購入商品リスト
Sub Example2()
    Dict_ValueArray_Customer
End Sub

'例3:シートデータを配列に格納
Sub Example3()
    Dict_ValueArray_FromSheet
End Sub

'例4:配列をJOINで文字列化
Sub Example4()
    Dict_ValueArray_Join
End Sub
VB

初心者向けポイント

  • Dictionaryの値は配列もOK → 複数データをまとめて管理できる。
  • ReDim Preserveで拡張 → 既存配列に新しい要素を追加可能。
  • JOINで文字列化 → 配列を見やすく出力できる。
  • 実務で便利 → 顧客ごとの購入商品、カテゴリごとの属性などを高速に管理。

👉 この「Valueに配列テンプレ」を覚えておけば、Dictionaryを使った 多値管理・顧客別商品リスト・カテゴリ別属性管理 をExcel VBAで簡単に実現できます。

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