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で処理 → 配列で一括書き込み
- 重複排除、検索、集計などはこのパターンで劇的に高速化
- 数万行でも処理時間が秒単位に短縮可能


