Excel VBA | 実務テンプレ20パターン(Dictionary版)

VBA
スポンサーリンク

ここでは 「大量データ × 配列 × Dictionary」 を使った “実務でそのまま使えるテンプレ20パターン” をまとめます。

どれも 高速(10万行~数百万行でも耐える) かつ
現場で本当に使う形 にしてあります。


① 重複排除(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
タイトルとURLをコピーしました