Excel VBA | Offset × 配列 × Dictionary を組み合わせた高速処理ライブラリ

VBA
スポンサーリンク

Offset × 配列 × Dictionary を組み合わせた高速処理ライブラリ(テンプレ)

Excel VBAで「大量データを高速処理」するには、セルを直接ループするのではなく

  1. Range → 配列に一括読み込み
  2. Dictionaryでキー管理や集計
  3. 結果を配列にまとめて 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)
VB

2. 隣列に「合計値」を出力(売上など)

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」パターンをライブラリ化しておけば、どんな表でも「隣列に集計結果を高速出力」できるようになります。

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