ここでは 「大量データ × 配列 × Dictionary」 を使った “実務でそのまま使えるテンプレ20パターン” をまとめます。
どれも 高速(10万行~数百万行でも耐える) かつ
現場で本当に使う形 にしてあります。
- ① 重複排除(Unique化)テンプレ
- ② 重複集計(SUM)テンプレ
- ③ 重複カウント(COUNT)テンプレ
- ④ 最大値・最小値(MAX/MIN)テンプレ
- ⑤ 置き換え(マスタ結合)テンプレ
- ⑥ 左外部結合(VLOOKUP高速化)テンプレ
- ⑦ 複数列結合(JOIN)テンプレ
- ⑧ 右外部結合テンプレ
- ⑨ 不一致行の抽出(アンマッチ)
- ⑩ 完全一致・差分チェックテンプレ
- ⑪ 高速フィルタ(条件抽出)テンプレ
- ⑫ 複数条件フィルタ
- ⑬ 重複行削除テンプレ
- ⑭ 重複行維持(最新行だけ残す)
- ⑮ マッピング(カテゴリ付与)テンプレ
- ⑯ 配列転置(縦→横 / 横→縦)テンプレ
- ⑰ グループごとに別シートへ出力
- ⑱ 集計表(ピボット代替)テンプレ
- ⑲ 高速検索(ほぼ0秒)テンプレ
- ⑳ 高速ソート(キーソート)テンプレ
① 重複排除(Unique化)テンプレ
' A列の値を重複なしで抽出 → B列に出力
Sub UniqueList()
Dim arr, dict As Object, i As Long, out()
arr = Range("A1").CurrentRegion.Value
Set dict = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(arr)
If arr(i, 1) <> "" Then dict(arr(i, 1)) = ""
Next i
out = dict.Keys
Range("B1").Resize(UBound(out) + 1).Value = Application.Transpose(out)
End Sub
VB② 重複集計(SUM)テンプレ
商品ごと数量合計など。
Sub SumByKey()
Dim arr, dict As Object, i&, k, outArr()
arr = Range("A1").CurrentRegion.Value
Set dict = CreateObject("Scripting.Dictionary")
' A列 商品 / B列 数量
For i = 2 To UBound(arr)
k = arr(i, 1)
If dict.Exists(k) Then
dict(k) = dict(k) + arr(i, 2)
Else
dict(k) = arr(i, 2)
End If
Next
' 書き戻し
ReDim outArr(1 To dict.Count, 1 To 2)
i = 1
For Each k In dict.Keys
outArr(i, 1) = k
outArr(i, 2) = dict(k)
i = i + 1
Next
Range("E1").Resize(UBound(outArr), 2).Value = outArr
End Sub
VB③ 重複カウント(COUNT)テンプレ
' ID出現回数をカウント
Sub CountByKey()
Dim arr, dict As Object, i&, k
Set dict = CreateObject("Scripting.Dictionary")
arr = Range("A1").CurrentRegion.Value
For i = 2 To UBound(arr)
k = arr(i, 1)
dict(k) = dict(k) + 1
Next
End Sub
VB④ 最大値・最小値(MAX/MIN)テンプレ
If dict.Exists(k) Then
If arr(i, 2) > dict(k) Then dict(k) = arr(i, 2)
Else
dict(k) = arr(i, 2)
End If
VB⑤ 置き換え(マスタ結合)テンプレ
商品コード → 商品名 など。
' マスタ範囲をDictionaryに
For i = 2 To lastM
dictMaster(arrM(i,1)) = arrM(i,2)
Next
' 本体に反映
If dictMaster.Exists(arr(i,1)) Then
arr(i,2) = dictMaster(arr(i,1))
End If
VB⑥ 左外部結合(VLOOKUP高速化)テンプレ
10万行×10万行でも一瞬。
If dict.Exists(key) Then
arr(i,3) = dict(key)
Else
arr(i,3) = "" ' VLOOKUPのIFERROR相当
End If
VB⑦ 複数列結合(JOIN)テンプレ
「商品×日付」など複合キーを作る。
k = arr(i,1) & "|" & arr(i,2)
VB⑧ 右外部結合テンプレ
For Each k In dict.Keys
' 本体に存在しない場合を検出
Next
VB⑨ 不一致行の抽出(アンマッチ)
本体にある→マスタにない、を抽出。
If Not dictMaster.Exists(arr(i,1)) Then
' outArr に追加
End If
VB⑩ 完全一致・差分チェックテンプレ
シート比較に使える。
If dictA.Exists(k) Then
If dictA(k) <> dictB(k) Then
' 値が違う → 差分へ
End If
Else
' Aに無くてBにある
End If
VB⑪ 高速フィルタ(条件抽出)テンプレ
AutoFilter より何倍も速い。
If arr(i,3) >= 100 Then
' 条件一致 → outArr に移す
End If
VB⑫ 複数条件フィルタ
If arr(i,1)="A" And arr(i,2)>=50 Then ...
VB⑬ 重複行削除テンプレ
1行目を残して後の重複は削除。
If dict.Exists(k) Then
' 削除フラグ
Else
dict(k) = True
End If
VB⑭ 重複行維持(最新行だけ残す)
最新データ優先処理。
' 上書きすると最新行が保持される
dict(k) = i
VB⑮ マッピング(カテゴリ付与)テンプレ
' マスタでカテゴリ付与
arr(i,3) = dictCat(arr(i,1))
VB⑯ 配列転置(縦→横 / 横→縦)テンプレ
Dictionary.Keys / Items を高速転置。
Range("A1").Resize(1, dict.Count).Value = dict.Keys
VB⑰ グループごとに別シートへ出力
商品ごと・部署ごと分割。
If Not dictSheets.Exists(k) Then
Set dictSheets(k) = Sheets.Add
End If
dictSheets(k).Range("A" & nextRow).Value = arr(i,1)
VB⑱ 集計表(ピボット代替)テンプレ
ピボット不要の高速集計。
If dict.Exists(k) Then
dict(k) = dict(k) + arr(i, 数量列)
Else
dict(k) = arr(i, 数量列)
End If
VB⑲ 高速検索(ほぼ0秒)テンプレ
100万件検索も即時。
If dict.Exists(SearchKey) Then MsgBox "あり"
VB⑳ 高速ソート(キーソート)テンプレ
Dictionary のキーを配列でソートし出力。
keys = dict.Keys
Call QuickSort(keys, 0, UBound(keys))
VB

