Offset × 配列 × Dictionary を組み合わせた高速処理ライブラリ(テンプレ)
Excel VBAで「大量データを高速処理」するには、セルを直接ループするのではなく
- Range → 配列に一括読み込み
- Dictionaryでキー管理や集計
- 結果を配列にまとめて Offset で一括書き戻し
この流れが鉄板です。
基本構造テンプレ
Option Explicit
Sub FastProcess_Offset_Array_Dict()
Dim ws As Worksheet
Dim srcRange As Range, dstRange As Range
Dim dataArr As Variant, resultArr() As Variant
Dim dict As Object
Dim i As Long, lastRow As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
' --- 1. 元データ範囲を配列に読み込み ---
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Set srcRange = ws.Range("A2:A" & lastRow) ' A列のデータ
dataArr = srcRange.Value ' 2次元配列
' --- 2. Dictionaryで集計 ---
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(dataArr, 1)
If Not dict.exists(dataArr(i, 1)) Then
dict(dataArr(i, 1)) = 1
Else
dict(dataArr(i, 1)) = dict(dataArr(i, 1)) + 1
End If
Next i
' --- 3. 結果を配列化 ---
ReDim resultArr(1 To dict.Count, 1 To 2)
For i = 0 To dict.Count - 1
resultArr(i + 1, 1) = dict.Keys()(i)
resultArr(i + 1, 2) = dict.Items()(i)
Next i
' --- 4. Offsetで隣列に一括書き戻し ---
Set dstRange = srcRange.Offset(0, 1).Resize(dict.Count, 2)
dstRange.Value = resultArr
End Sub
VBこのテンプレのポイント
- セルを1つずつ読むのは遅い → 配列に一括読み込み
- Dictionaryでキーごとに集計 → 高速検索・重複排除が得意
- 結果を配列にまとめて → Offsetで隣列に一括書き込み
- Resizeでサイズを動的に調整 → データ量に応じて自動拡張
応用パターン
1. 隣列に「ユニーク値リスト」を出力
dstRange.Value = Application.Transpose(dict.Keys)
VB2. 隣列に「合計値」を出力(売上など)
dict(dataArr(i, 1)) = dict(dataArr(i, 1)) + dataArr(i, 2)
VB👉 2列目の数値を加算して集計。
3. 表形式で「キー+集計結果」を出力
resultArr(i + 1, 1) = dict.Keys()(i)
resultArr(i + 1, 2) = dict.Items()(i)
VB実務での使いどころ
- 売上表の「商品別集計」を隣列に出す
- 勤怠表の「社員別勤務日数」をまとめる
- 在庫リストの「品目別数量合計」を高速算出
- アンケート回答の「選択肢別件数」を集計
💡 この「Offset × 配列 × Dictionary」パターンをライブラリ化しておけば、どんな表でも「隣列に集計結果を高速出力」できるようになります。
