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で 商品別・顧客別・カテゴリ別の集計処理 を高速に実務へ応用できます。
