Excel VBA | セルブロック × 配列 × Dictionary の高速処理パターン集

Excel VBA VBA
スポンサーリンク

ここでは セルブロックを配列に読み込み → 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. 月別勤務時間集計

  • 配列:日付列+勤務時間列
  • DictionaryFormat(日付,"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」パターンを使えば、売上表・勤怠表・在庫表などで カテゴリ別・月別・部署別の集計を一瞬で処理できます。

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