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

VBA
スポンサーリンク

VBAで「配列」と「Dictionary」を組み合わせると、処理速度を大幅に改善できます。特に大量データを扱うときに有効です。以下に整理してみます。


VBAで配列 + Dictionary を組み合わせるメリット

  • 配列 (Array)
    • メモリ上に連続してデータを保持
    • インデックスアクセスが高速
    • ループ処理に向いている
  • Dictionary (Scripting.Dictionary)
    • キーによる高速検索(平均 O(1))
    • 重複チェックやマッピングに便利
    • 値に配列やオブジェクトを格納することも可能

👉 組み合わせることで「順序処理は配列」「検索や重複判定はDictionary」と役割分担できる。


典型的な利用パターン

1. 重複排除 + 高速検索

Sub RemoveDuplicates()
    Dim arr, dict As Object, result() As Variant
    Dim i As Long
    
    arr = Array("A", "B", "C", "A", "B", "D")
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 配列を走査してDictionaryに格納(キー重複は自動排除)
    For i = LBound(arr) To UBound(arr)
        dict(arr(i)) = 1
    Next
    
    ' Dictionaryのキーを配列に戻す
    result = dict.Keys
    
    ' 結果表示
    For i = LBound(result) To UBound(result)
        Debug.Print result(i)
    Next
End Sub
VB
  • 配列で一括処理
  • Dictionaryで重複排除と高速検索

2. インデックス ↔ キーの相互変換

Sub IndexMapping()
    Dim arr, dict As Object
    Dim i As Long
    
    arr = Array("Alice", "Bob", "Charlie")
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 名前 → インデックス のマッピング
    For i = LBound(arr) To UBound(arr)
        dict(arr(i)) = i
    Next
    
    ' 高速検索
    Debug.Print dict("Charlie")  ' → 2
End Sub
VB
  • 配列で順序処理
  • Dictionaryで「名前からインデックス」を即座に取得

3. 頻度カウント

Sub FrequencyCount()
    Dim arr, dict As Object
    Dim i As Long
    
    arr = Array("A", "B", "A", "C", "B", "A")
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 出現回数をカウント
    For i = LBound(arr) To UBound(arr)
        If dict.Exists(arr(i)) Then
            dict(arr(i)) = dict(arr(i)) + 1
        Else
            dict(arr(i)) = 1
        End If
    Next
    
    ' 結果表示
    For Each key In dict.Keys
        Debug.Print key & ": " & dict(key)
    Next
End Sub
VB
  • 配列で走査
  • Dictionaryでカウントを保持

高速化のコツ

  • 配列に一括読み込み(Range.Value → Variant配列)でセルアクセスを最小化
  • Dictionaryで検索や重複排除を行う
  • 結果を配列に戻すことで再度一括処理可能

Excel VBAでは「セルを1つずつ処理」すると遅いので、
配列 + Dictionary の組み合わせが最強の高速化パターンです。

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