Excel VBA | ブロックループ × Offset × Resize × Dictionary でグループ集計を高速化

Excel VBA VBA
スポンサーリンク

ここでは ブロックループ(矩形単位)Offset × Resize を組み合わせ、さらに Dictionary を活用して「グループ集計」を効率化する黄金パターンをまとめます。
Dictionary を使うことで、同じカテゴリやキーごとの集計を一瞬で処理でき、従来のループよりも高速になります。


基本構造

Dim blk As Range, r As Range
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

' ブロック単位でループ
For Each blk In Range("A2:D20").Areas
    For Each r In blk.Rows
        ' キー(カテゴリ)を取得
        Dim key As String
        key = r.Cells(1, 1).Value
        
        ' 値(集計対象)を取得
        Dim val As Double
        val = r.Cells(1, 2).Value
        
        ' Dictionary に加算
        If dict.Exists(key) Then
            dict(key) = dict(key) + val
        Else
            dict.Add key, val
        End If
    Next r
Next blk

' 集計結果を出力
Dim pasteRow As Long
pasteRow = 30
Dim k As Variant
For Each k In dict.Keys
    Cells(pasteRow, 1).Value = k
    Cells(pasteRow, 2).Value = dict(k)
    pasteRow = pasteRow + 1
Next k
VB

👉 各ブロックを走査し、カテゴリ別に合計を Dictionary で高速集計。結果を下段にまとめて出力。


応用パターン集

1. 部署別勤務時間集計

  • キー:部署名
  • :勤務時間
  • 結果:部署ごとの勤務時間合計を下段に出力

2. 商品カテゴリ別売上集計

  • キー:商品カテゴリ
  • :売上金額
  • 結果:カテゴリ別売上を右側ブロックに出力

3. 月別在庫入荷数集計

  • キー:入荷月 (Format(日付,"YYYY/MM"))
  • :入荷数
  • 結果:月別入荷数を別ブロックに展開

4. エラー件数集計

  • キー:エラー種別
  • :件数(1件ごとに +1)
  • 結果:エラー種別ごとの件数を右隣に出力

5. グループごとに平均値を算出

  • キー:グループ名
  • :合計値と件数を Dictionary に保持(配列やカスタム型)
  • 結果:平均値を下段に出力

✅ 高速化のポイント

  • Dictionary → キーごとに即時集計(重複キーは自動加算)
  • ブロックループ → 表を矩形単位で処理し、柔軟に範囲を指定
  • Offset × Resize → 出力先を自在に制御
  • 結果出力 → 下段や右側にまとめて展開

💡 この「ブロックループ × Offset × Resize × Dictionary」パターンを使えば、売上表・勤怠表・在庫表などで カテゴリ別・月別・部署別の集計を一瞬で処理できます。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました