GROUP BY風処理(グループ集計)
Excel VBAにはSQLのような GROUP BY 構文はありませんが、Dictionary を使えば「キーごとに集計」する処理を簡単に実現できます。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- Dictionaryを利用
- キー(商品名や顧客コードなど)をユニークに保持。
- 値に「合計」「件数」などを格納。
- Rangeを配列に読み込む
- 大量データでも高速処理。
- ループで集計
- キーが存在すれば加算、なければ新規追加。
テンプレ1:商品ごとの数量合計(GROUP BY風)
Sub GroupBy_Sum()
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 GroupBy_Count()
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 GroupBy_Average()
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:複数条件でGROUP BY風処理(商品×地域)
Sub GroupBy_MultiKey()
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()
GroupBy_Sum
End Sub
'例2:顧客ごとの件数カウント
Sub Example2()
GroupBy_Count
End Sub
'例3:商品ごとの平均数量
Sub Example3()
GroupBy_Average
End Sub
'例4:商品×地域の複合集計
Sub Example4()
GroupBy_MultiKey
End Sub
VB初心者向けポイント
- Dictionaryはキー重複不可 → 自動的に「GROUP BY風」になる。
- Existsで判定して加算 → 合計や件数を簡単に作れる。
- 複数Dictionaryで平均も可能 → 合計と件数を分けて保持。
- 複合キーで多次元集計 → 商品+地域など複数条件も扱える。
- 大量データでも高速 → 数万件でも一瞬で集計可能。
👉 この「GROUP BY風処理テンプレ」を覚えておけば、SQLのような集計をExcel VBAで 高速かつ柔軟 に実務へ応用できます。
