VLOOKUP を使わずに大量データを高速に突合する(Dictionary で照合)

公開日:2026年10月3日 執筆:Takuya カテゴリ:データ集計・抽出

2つの表をコードで照合して、片方にしかないデータや金額の違うデータを洗い出すマクロです。VLOOKUP を数万行に入れて重くなる問題を Dictionary で解決します。

どんな場面で使うか

基幹システムの売上データと、取引先から届いた請求データを照合する。今月と先月の顧客一覧を比べて、増えた顧客と減った顧客を出す。こうした突合(照合)作業は、VLOOKUP 関数を何万行にも入れるとブックが重くなり、再計算のたびに待たされます。

VBA で片方の表を Dictionary に読み込み、もう片方の表のキーで検索すれば、数万行どうしでも数秒で照合できます。結果は値として書き出すので、ブックも重くなりません。

照合の考え方

照合は「キー(伝票番号や顧客コード)で両方の表を結びつけ、項目を比べる」作業です。片方を Dictionary に入れておき、もう片方を1行ずつ調べて、次の3つに分類します。

  • 両方にあり、金額も一致
  • 両方にあるが、金額が違う
  • 片方にしかない(相手側の表に存在しない)

コード

「自社」シートと「先方」シートを伝票番号(A列)で照合し、C列の金額を比べます。結果は自社シートのD列に書き込み、先方にしかない伝票番号は最後にメッセージで知らせます。

Sub MatchTables()
    Dim wsA As Worksheet, wsB As Worksheet, dic As Object
    Dim a As Variant, b As Variant, res() As Variant
    Dim i As Long, key As String, onlyB As String

    Set wsA = ThisWorkbook.Worksheets("自社")
    Set wsB = ThisWorkbook.Worksheets("先方")
    Set dic = CreateObject("Scripting.Dictionary")

    b = wsB.Range("A2:C" & wsB.Cells(wsB.Rows.Count, "A").End(xlUp).Row).Value
    For i = 1 To UBound(b, 1)
        key = Trim(CStr(b(i, 1)))
        If key <> "" Then dic(key) = b(i, 3)      ' 伝票番号 → 金額
    Next i

    a = wsA.Range("A2:C" & wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row).Value
    ReDim res(1 To UBound(a, 1), 1 To 1)
    For i = 1 To UBound(a, 1)
        key = Trim(CStr(a(i, 1)))
        If Not dic.Exists(key) Then
            res(i, 1) = "先方になし"
        ElseIf dic(key) <> a(i, 3) Then
            res(i, 1) = "金額違い(先方 " & dic(key) & ")"
            dic.Remove key
        Else
            res(i, 1) = "一致"
            dic.Remove key
        End If
    Next i
    wsA.Range("D1").Value = "照合結果"
    wsA.Range("D2").Resize(UBound(res, 1), 1).Value = res

    ' 残ったキー=先方にしかない伝票
    If dic.Count > 0 Then onlyB = Join(dic.Keys, ", ")
    MsgBox "照合が終わりました。先方にしかない伝票:" & dic.Count & " 件" & vbCrLf & Left(onlyB, 500)
End Sub

コードのポイント

照合が済んだキーは dic.Remove で取り除いています。こうすると、ループの最後に Dictionary に残っているキーが、そのまま「先方にしかないデータ」になります。両方向の差分を1回の処理で出せるのが、この書き方の利点です。

結果は配列 res にためて最後に一括で書き込んでいるため、行数が多くても速く動きます。

照合でよくある落とし穴

キーの型がそろっていないと、同じ伝票番号でも一致しません。片方が数値の 1001、もう片方が文字列の「001001」のような場合は、Format 関数で桁数をそろえるなど、比較の前に表記を統一します。

金額の比較では、端数処理の違いで1円ずれることがあります。許容する差がある場合は、Abs(差) <= 1 のような条件に変えてください。

※照合結果は必ず人の目でも確認し、マクロの判定だけで取引先への連絡などを行わないようにしてください。

ほかの記事