ここでは セルブロックを配列に読み込み → Dictionary で集計・変換 → 結果を一括出力 する高速処理パターンをまとめます。
セルを 1 つずつループするよりも、配列にまとめて処理することで劇的に速度が向上します。
基本構造
Sub BlockArrayDictionary()
Dim rng As Range, arr As Variant
Dim dict As Object, i As Long
' 対象セルブロックを配列に読み込み
Set rng = Range("A2:D100")
arr = rng.Value
' Dictionary 初期化
Set dict = CreateObject("Scripting.Dictionary")
' 配列を走査して集計
For i = 1 To UBound(arr, 1)
Dim key As String, val As Double
key = arr(i, 1) ' カテゴリ列
val = arr(i, 2) ' 値列
If dict.Exists(key) Then
dict(key) = dict(key) + val
Else
dict.Add key, val
End If
Next i
' 結果を出力
Dim pasteRow As Long, k As Variant
pasteRow = 2
For Each k In dict.Keys
Cells(pasteRow, 6).Value = k
Cells(pasteRow, 7).Value = dict(k)
pasteRow = pasteRow + 1
Next k
End Sub
VB👉 セルブロック → 配列 → Dictionary → 出力 の流れで高速化。
応用パターン集
1. 商品カテゴリ別売上集計
- 配列:商品カテゴリ列+売上金額列
- Dictionary:カテゴリごとに売上合計
- 結果:カテゴリ別売上を右側に展開
2. 月別勤務時間集計
- 配列:日付列+勤務時間列
- Dictionary:
Format(日付,"YYYY/MM")をキーに勤務時間加算 - 結果:月別勤務時間を下段に出力
3. 部署別在庫件数集計
- 配列:部署列+在庫数列
- Dictionary:部署ごとに在庫件数加算
- 結果:部署別在庫件数を右側に展開
4. エラー種別件数集計
- 配列:エラー種別列
- Dictionary:種別ごとに件数カウント
- 結果:エラー種別ごとの件数を下段に出力
5. 多次元キー(カテゴリ × 月)
Dim key As String
key = arr(i, 1) & "_" & Format(arr(i, 2), "YYYY/MM")
VB👉 複数列を組み合わせてキー化し、カテゴリ × 月別集計を実現。
6. 平均値集計(合計+件数)
If dict.Exists(key) Then
dict(key)(0) = dict(key)(0) + val ' 合計
dict(key)(1) = dict(key)(1) + 1 ' 件数
Else
dict.Add key, Array(val, 1)
End If
VB👉 Dictionary の値に配列を持たせて「合計+件数」を保持し、平均値を算出。
7. 最大値・最小値の保持
If dict.Exists(key) Then
If val > dict(key)(0) Then dict(key)(0) = val ' 最大値
If val < dict(key)(1) Then dict(key)(1) = val ' 最小値
Else
dict.Add key, Array(val, val)
End If
VB👉 Dictionary の値に配列を持たせて「最大値・最小値」を同時に保持。
8. 配列で一括出力
Dim outArr() As Variant, j As Long
ReDim outArr(1 To dict.Count, 1 To 2)
j = 1
For Each k In dict.Keys
outArr(j, 1) = k
outArr(j, 2) = dict(k)
j = j + 1
Next k
Range("F2").Resize(dict.Count, 2).Value = outArr
VB👉 結果を配列にまとめて一括出力(セル書き込みを最小化)。
9. 複数ブロックを同時処理
- 配列に複数ブロックを読み込み
- Dictionaryでキーごとに集計
- 結果をまとめて出力
10. 高速フィルタリング
- 配列で全データを読み込み
- Dictionaryで条件一致データのみ保持
- 結果を別ブロックに展開
✅ まとめ
- セルブロック → 配列化 → 高速処理の基本
- Dictionary → キーごとに即時集計
- 値に配列を持たせる → 合計+件数、最大+最小など複数統計を同時保持
- 一括出力 →
Resizeで配列をまとめて書き戻すことでさらに高速化
💡 この「セルブロック × 配列 × Dictionary」パターンを使えば、売上表・勤怠表・在庫表などで カテゴリ別・月別・部署別の集計を一瞬で処理できます。

