配列 × Dictionary の組み合わせ
Excel VBAで大量データを扱うとき、配列とDictionary(辞書オブジェクト)を組み合わせると「高速」「柔軟」な処理ができます。初心者向けに、コード例とテンプレートをかみ砕いて説明します。
基本の考え方
- 配列: Rangeを一括で読み込んで高速処理。
- Dictionary: キー(重複判定や検索基準)を高速に管理。
- 組み合わせ: 配列でデータを保持し、Dictionaryでユニーク化や集計を行う。
テンプレ1:配列をDictionaryでユニーク化
Sub Array_Dict_Unique()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A列を配列に読み込み
Dim v As Variant
v = ws.Range("A2:A" & lastRow).Value
' Dictionaryでユニーク化
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long, key As String
For i = 1 To UBound(v, 1)
key = Trim(CStr(v(i, 1)))
If Len(key) > 0 Then dict(key) = True
Next i
' 結果を別シートに出力
Dim wsOut As Worksheet: Set wsOut = Worksheets.Add
wsOut.Range("A1").Value = "ユニーク一覧"
Dim r As Long: r = 2
Dim k As Variant
For Each k In dict.Keys
wsOut.Cells(r, 1).Value = k
r = r + 1
Next
End Sub
VB- ポイント: 配列で読み込んだデータをDictionaryでユニーク化。重複除去が一瞬でできる。
テンプレ2:配列をDictionaryで集計(合計)
Sub Array_Dict_Sum()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A列=商品, B列=数量
Dim v As Variant
v = ws.Range("A2:B" & lastRow).Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long, key As String
For i = 1 To UBound(v, 1)
key = Trim(CStr(v(i, 1)))
If Len(key) > 0 Then
If dict.Exists(key) Then
dict(key) = dict(key) + v(i, 2)
Else
dict(key) = v(i, 2)
End If
End If
Next i
' 結果を別シートに出力
Dim wsOut As Worksheet: Set wsOut = Worksheets.Add
wsOut.Range("A1:B1").Value = Array("商品", "数量合計")
Dim r As Long: r = 2
Dim k As Variant
For Each k In dict.Keys
wsOut.Cells(r, 1).Value = k
wsOut.Cells(r, 2).Value = dict(k)
r = r + 1
Next
End Sub
VB- ポイント: 商品ごとに数量を合計。ピボットテーブルのような集計がVBAだけで可能。
テンプレ3:複合キーで集計(商品×日付)
Sub Array_Dict_CompositeKey()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A列=商品, B列=日付, C列=数量
Dim v As Variant
v = ws.Range("A2:C" & lastRow).Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long, key As String
For i = 1 To UBound(v, 1)
key = Trim(CStr(v(i, 1))) & "|" & Format(v(i, 2), "yyyy-mm-dd")
If dict.Exists(key) Then
dict(key) = dict(key) + v(i, 3)
Else
dict(key) = v(i, 3)
End If
Next i
' 結果を別シートに出力
Dim wsOut As Worksheet: Set wsOut = Worksheets.Add
wsOut.Range("A1:C1").Value = Array("商品", "日付", "数量合計")
Dim r As Long: r = 2
Dim k As Variant, parts() As String
For Each k In dict.Keys
parts = Split(k, "|")
wsOut.Cells(r, 1).Value = parts(0)
wsOut.Cells(r, 2).Value = parts(1)
wsOut.Cells(r, 3).Value = dict(k)
r = r + 1
Next
End Sub
VB- ポイント: 複数列を組み合わせてキーにすることで「商品×日付」単位で集計できる。
テンプレ4:検索用にDictionaryを使う
Sub Array_Dict_Search()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A列=コード, B列=名前
Dim v As Variant
v = ws.Range("A2:B" & lastRow).Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
For i = 1 To UBound(v, 1)
dict(Trim(CStr(v(i, 1)))) = v(i, 2)
Next i
' 検索例
Dim code As String: code = "C001"
If dict.Exists(code) Then
MsgBox "コード " & code & " の名前は " & dict(code)
Else
MsgBox "コード " & code & " は存在しません"
End If
End Sub
VB- ポイント: コードをキーにして名前を高速検索。数万件でも一瞬。
例題で練習
'例1:A列のユニーク一覧を作成
Sub Example_Unique()
Array_Dict_Unique
End Sub
'例2:商品ごとに数量を合計
Sub Example_Sum()
Array_Dict_Sum
End Sub
'例3:商品×日付で数量を集計
Sub Example_Composite()
Array_Dict_CompositeKey
End Sub
'例4:コードをキーにして名前を検索
Sub Example_Search()
Array_Dict_Search
End Sub
VB初心者向けポイント
- 配列で一括読み込み: セルを1つずつ読むより圧倒的に速い。
- Dictionaryでユニーク化・集計: キー存在判定が一瞬。重複除去や集計に最適。
- 複合キー: 「商品|日付」のように文字列連結で複数列をキーにできる。
- 検索も高速: 数万件のデータでも即座に検索可能。
- 出力は別シート: 元データを壊さずに結果を確認できる。
