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 の組み合わせが最強の高速化パターンです。


