Excel VBA 逆引き集 | 配列×Dictionary

Excel VBA
スポンサーリンク

配列 × 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でユニーク化・集計: キー存在判定が一瞬。重複除去や集計に最適。
  • 複合キー: 「商品|日付」のように文字列連結で複数列をキーにできる。
  • 検索も高速: 数万件のデータでも即座に検索可能。
  • 出力は別シート: 元データを壊さずに結果を確認できる。

タイトルとURLをコピーしました