Excel VBA 逆引き集 | Dictionary高速テンプレ(集計)

Excel VBA
スポンサーリンク

Dictionary高速テンプレ(集計)

Excel VBAで大量データを扱うとき、Dictionary を使えば「キーごとに集計」する処理を高速に実現できます。SQLの GROUP BY のような処理を、シンプルなコードで書けるのが魅力です。初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • Dictionaryはキー重複不可 → 同じキーが出てきたら値を加算すれば「集計」になる。
  • Existsで判定 → 既にキーがあるかどうかを確認。
  • Keysで一覧取得 → 集計結果をまとめて出力できる。
  • 用途:
    • 商品別数量合計
    • 顧客別売上合計
    • カテゴリ別件数

テンプレ1:商品別数量合計

Sub Dict_SumByProduct()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C100") ' A=商品名, C=数量
    Dim v As Variant: v = rg.Value

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

    For r = 1 To UBound(v, 1)
        key = v(r, 1) ' 商品名
        If dict.Exists(key) Then
            dict(key) = dict(key) + v(r, 3)
        Else
            dict(key) = v(r, 3)
        End If
    Next r

    ' 結果出力
    Dim k As Variant, i As Long: i = 2
    For Each k In dict.Keys
        ws.Cells(i, 5).Value = k
        ws.Cells(i, 6).Value = dict(k)
        i = i + 1
    Next k
End Sub
VB
  • ポイント:
    • 商品名をキーにして数量を加算。
    • E列に商品名、F列に合計を出力。

テンプレ2:顧客別件数カウント

Sub Dict_CountByCustomer()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:B100") ' A=顧客コード
    Dim v As Variant: v = rg.Value

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

    For r = 1 To UBound(v, 1)
        key = v(r, 1) ' 顧客コード
        If dict.Exists(key) Then
            dict(key) = dict(key) + 1
        Else
            dict(key) = 1
        End If
    Next r

    ' 出力
    Dim k As Variant, i As Long: i = 2
    For Each k In dict.Keys
        ws.Cells(i, 5).Value = k
        ws.Cells(i, 6).Value = dict(k)
        i = i + 1
    Next k
End Sub
VB
  • ポイント: 顧客コードごとに登場回数をカウント。

テンプレ3:カテゴリ別平均値(合計+件数)

Sub Dict_AverageByCategory()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C100") ' A=カテゴリ, C=数量
    Dim v As Variant: v = rg.Value

    Dim dictSum As Object: Set dictSum = CreateObject("Scripting.Dictionary")
    Dim dictCount As Object: Set dictCount = CreateObject("Scripting.Dictionary")

    Dim r As Long, key As String
    For r = 1 To UBound(v, 1)
        key = v(r, 1)
        If dictSum.Exists(key) Then
            dictSum(key) = dictSum(key) + v(r, 3)
            dictCount(key) = dictCount(key) + 1
        Else
            dictSum(key) = v(r, 3)
            dictCount(key) = 1
        End If
    Next r

    ' 平均を出力
    Dim k As Variant, i As Long: i = 2
    For Each k In dictSum.Keys
        ws.Cells(i, 5).Value = k
        ws.Cells(i, 6).Value = dictSum(k) / dictCount(k)
        i = i + 1
    Next k
End Sub
VB
  • ポイント:
    • 合計と件数を別Dictionaryに保持。
    • 平均値を計算して出力。

テンプレ4:複合キーで集計(商品×地域)

Sub Dict_SumByMultiKey()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:D100") ' A=商品, B=地域, D=数量
    Dim v As Variant: v = rg.Value

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

    For r = 1 To UBound(v, 1)
        key = v(r, 1) & "_" & v(r, 2) ' 商品+地域
        If dict.Exists(key) Then
            dict(key) = dict(key) + v(r, 4)
        Else
            dict(key) = v(r, 4)
        End If
    Next r

    ' 出力
    Dim k As Variant, i As Long: i = 2
    For Each k In dict.Keys
        ws.Cells(i, 5).Value = k
        ws.Cells(i, 6).Value = dict(k)
        i = i + 1
    Next k
End Sub
VB
  • ポイント: 複数列を組み合わせてキーにすれば「商品×地域」などの複合集計が可能。

例題で練習

'例1:商品別数量合計
Sub Example1()
    Dict_SumByProduct
End Sub

'例2:顧客別件数カウント
Sub Example2()
    Dict_CountByCustomer
End Sub

'例3:カテゴリ別平均値
Sub Example3()
    Dict_AverageByCategory
End Sub

'例4:商品×地域の複合集計
Sub Example4()
    Dict_SumByMultiKey
End Sub
VB

初心者向けポイント

  • Dictionaryはキー重複不可 → 自動的に「集計」になる。
  • Existsで判定して加算 → 合計や件数を簡単に作れる。
  • 複数Dictionaryで平均も可能 → 合計と件数を分けて保持。
  • 複合キーで多次元集計 → 商品+地域など複数条件も扱える。
  • 大量データでも高速 → 数万件でも一瞬で集計可能。

👉 この「Dictionary高速テンプレ(集計)」を覚えておけば、Excel VBAで 商品別・顧客別・カテゴリ別の集計処理 を高速に実務へ応用できます。

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