Excel VBA | 大量データ × 配列 × Dictionary で最強高速化

VBA
スポンサーリンク

以下では 「大量データ × 配列 × Dictionary」 を組み合わせて
VBA の処理を “最強レベルに高速化する” 方法を、
プログラミング初心者向けにかみ砕いてまとめます。

VBA で大量データを扱うと、
1セルずつ読み書きするだけで極端に遅くなる のが最大の弱点です。

そこで使うべきなのが

  • 配列(Variant 2次元)で一括読み込み & 一括書き込み
  • Dictionary で高速検索 & 集計 & 重複チェック
  • 自動範囲検出でどんなデータでも対応

この3つの組み合わせで、
10万行でも1秒以内で処理できるレベルまで高速化できます。


全体像(最強パターン)

① UsedRange でデータ範囲を自動検出 → 配列に一括読み込み

② Dictionary で高速処理(検索・重複排除・集計・置き換え 等)

③ 配列を Range に一括書き戻し

これが VBA 高速化の黄金フローです。


なぜ速いのか?(初心者向けに図でイメージ)

❌ 遅い方法

For i = 2 To 最終行
    If Cells(i, 1).Value = "A" Then
        '…
    End If
Next
VB

10万回「シート ↔ VBA」の往復が発生する
➡ Excel の画面更新・内部処理で激遅


✔ 爆速になる方法

arr = Range("A1").CurrentRegion.Value   ' ← 一括で読み込む
' VBA 内で全部処理(超速)
Range("A1").Resize(UBound(arr), UBound(arr,2)).Value = arr   ' ← 一括で戻す
VB

往復回数は「2回だけ」
➡ 10万行なら 100倍以上速い


最強構成の実践サンプル(テンプレ)

テンプレ:大量データ × 配列 × Dictionary 全自動処理

例:
「商品コード列の重複を削除し、合計数量を集計して、一覧を作り直す」

(10万行でも1秒レベル)

Option Explicit

Sub SuperFast_Dict_Array()
    Dim ws As Worksheet
    Dim rg As Range
    Dim arr, outArr
    Dim dict As Object
    Dim i As Long, lastRow As Long
    Dim key As Variant
    
    Set ws = ActiveSheet
    Set rg = ws.Range("A1").CurrentRegion   ' 自動検出
    
    '--- ① 一括読み込み ---
    arr = rg.Value   ' 2次元配列
    
    '--- ② Dictionaryで重複キー集計 ---
    Set dict = CreateObject("Scripting.Dictionary")

    ' 商品コード:1列目  / 数量:2列目 の例
    For i = 2 To UBound(arr)
        key = arr(i, 1)
        If key <> "" Then
            If dict.Exists(key) Then
                dict(key) = dict(key) + arr(i, 2)
            Else
                dict.Add key, arr(i, 2)
            End If
        End If
    Next i
    
    '--- ③ 出力用配列を作る ---
    ReDim outArr(1 To dict.Count + 1, 1 To 2)
    
    ' 見出し
    outArr(1, 1) = "商品コード"
    outArr(1, 2) = "合計数量"
    
    ' データ書き込み
    i = 2
    For Each key In dict.Keys
        outArr(i, 1) = key
        outArr(i, 2) = dict(key)
        i = i + 1
    Next key
    
    '--- ④ シートに一括書き戻し ---
    ws.Range("E1").Resize(UBound(outArr), UBound(outArr, 2)).Value = outArr
    
    MsgBox "完了(超高速)!"
End Sub
VB

このテンプレでできること(実務)

やりたいことやり方
重複チェックDictionary のキー
重複排除存在チェック後追加
重複集計dict(key) = dict(key) + 数値
リスト化Keys を outArr に書く
置き換え(マスタ参照)dict にマスタを入れて検索
高速検索dict.Exists(key)
大量データ×検索Dictionary が最速(ほぼ O(1))
ソート配列をソート(バブル/クイック)
CSV/ログ集計にも応用同じフローでOK

コアテクニックまとめ(初心者向け)

✔ 自動範囲検出

Set rg = Range("A1").CurrentRegion
VB

✔ 一括読み込み(最強)

arr = rg.Value
VB

✔ Dictionary(連想配列)

Set dict = CreateObject("Scripting.Dictionary")
VB

✔ キー存在確認(高速)

If dict.Exists(key) Then ...
VB

✔ 一括書き戻し

Range("A1").Resize(UBound(arr), UBound(arr,2)).Value = arr
VB

さらに最強化したい?(応用テーマ提案)

続きとして以下を作れます:

  • 巨大データでも高速な Dictionary 置換マスタ処理テンプレ
  • 高速フィルタ(条件抽出)× 配列
  • 複数列集計(SUM / COUNT / MAX / MIN)テンプレ
  • 複数キー(商品×日付)で Dictionary を2次元化
  • 重複行削除(Unique 生成)の最速コード
  • 配列 × Dictionary × AdvancedFilter のハイブリッド

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