以下では 「大量データ × 配列 × 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 のハイブリッド

