Excel VBA | 配列 + Dictionary を組み合わせた高速処理

VBA
スポンサーリンク

Excel VBAでシートのデータ処理を高速化するには「セルを直接操作しない」「配列とDictionaryを活用する」が鉄則です。ポイントを整理します。


高速化の基本戦略

  • セルを1つずつ処理しない
    Range.Value で一括して配列に読み込み、メモリ上で処理する
  • Dictionaryで検索や重複排除を行う
    → キー検索が高速なので、データの存在確認や集計に最適
  • 結果を配列に戻して一括書き込み
    Range.Value = 配列 で一度に出力すれば処理が爆速化

実用例

1. 重複排除

Sub RemoveDuplicatesFast()
    Dim ws As Worksheet, arr As Variant, dict As Object
    Dim i As Long, result() As Variant
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    arr = ws.Range("A1:A1000").Value  ' 一括読み込み
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 配列を走査してDictionaryに格納
    For i = 1 To UBound(arr)
        dict(arr(i, 1)) = 1
    Next
    
    ' 結果を配列に戻す
    result = Application.Transpose(dict.Keys)
    ws.Range("C1").Resize(UBound(result), 1).Value = result
End Sub
VB

👉 数千行でも一瞬で重複排除できます。


2. 頻度カウント

Sub FrequencyCountFast()
    Dim ws As Worksheet, arr As Variant, dict As Object
    Dim i As Long
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    arr = ws.Range("A1:A1000").Value
    Set dict = CreateObject("Scripting.Dictionary")
    
    For i = 1 To UBound(arr)
        If dict.Exists(arr(i, 1)) Then
            dict(arr(i, 1)) = dict(arr(i, 1)) + 1
        Else
            dict(arr(i, 1)) = 1
        End If
    Next
    
    ' 出力
    ws.Range("C1").Resize(dict.Count, 1).Value = Application.Transpose(dict.Keys)
    ws.Range("D1").Resize(dict.Count, 1).Value = Application.Transpose(dict.Items)
End Sub
VB

👉 「値ごとの出現回数」を一瞬で集計。


3. 検索の高速化

Sub FastLookup()
    Dim ws As Worksheet, arr As Variant, dict As Object
    Dim i As Long
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    arr = ws.Range("A1:B1000").Value
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' ID → 名前 のマッピング
    For i = 1 To UBound(arr)
        dict(arr(i, 1)) = arr(i, 2)
    Next
    
    ' 高速検索
    MsgBox dict("ID123")  ' ID123に対応する名前を即取得
End Sub
VB

👉 VLOOKUPの代替として使うと爆速になります。


まとめ

  • 配列で一括読み込み → Dictionaryで処理 → 配列で一括書き込み
  • 重複排除、検索、集計などはこのパターンで劇的に高速化
  • 数万行でも処理時間が秒単位に短縮可能
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました