Excel VBA 逆引き集 | GROUP BY風処理

Excel VBA
スポンサーリンク

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で 高速かつ柔軟 に実務へ応用できます。

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