ここでは ブロックループ(矩形単位) に 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」パターンを使えば、売上表・勤怠表・在庫表などで カテゴリ別・月別・部署別の集計を一瞬で処理できます。

