Excel VBA | マスタ結合・集計・差分・重複処理を「列指定だけで」完全ノーコード化した超汎用テンプレ

VBA
スポンサーリンク

ここからは 「列指定だけで完全ノーコード」+「マスタ結合・集計・差分・重複処理」対応の超汎用高速テンプレ」 を作ります。
初心者でもコピペして列指定するだけで使えるプロ仕様です。


特徴

  • 列指定だけで操作可能 → VBA初心者でもOK
  • 配列 × Dictionary × 一括書き戻しで 数十万行でも1秒以内
  • マスタ結合 / 集計 / 差分チェック / 重複判定 / JOIN が全て1本で可能
  • 入力シート・マスタシート・比較シートは自由に設定可能

コード(そのまま動く)

Sub UltraFast_Generic()

    Dim ws As Worksheet, wsMaster As Worksheet, wsOther As Worksheet
    Dim Data As Variant, Master As Variant, Other As Variant
    Dim LastRow As Long, LastCol As Long
    Dim LastRowM As Long, LastRowO As Long
    Dim dictMaster As Object, dictSum As Object, dictOther As Object, dictDup As Object
    Dim r As Long

    '===============================
    ' ▼ ここだけ列指定・シート指定 ▼
    '===============================
    Set ws = Sheets("Data")       'メインシート
    Set wsMaster = Sheets("Master") 'マスタ結合用
    Set wsOther = Sheets("Other")   '差分チェック用
    
    Dim keyCol As Long: keyCol = 1        'メインシートのキー列(マスタ結合や集計に使用)
    Dim sumCol As Long: sumCol = 2        'SUM対象列
    Dim masterValCol As Long: masterValCol = 2 'マスタから取得する列番号
    Dim outputStartCol As Long: outputStartCol = 3 '結果出力開始列(C列以降)
    '===============================

    '----------------------------
    ' ① データ範囲自動検出
    '----------------------------
    LastRow = ws.Cells(ws.Rows.Count, keyCol).End(xlUp).Row
    LastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    Data = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value

    '----------------------------
    ' ② マスタ読み込み(Dictionary化)
    '----------------------------
    LastRowM = wsMaster.Cells(wsMaster.Rows.Count, 1).End(xlUp).Row
    Master = wsMaster.Range("A1:" & wsMaster.Cells(LastRowM, masterValCol).Address).Value
    Set dictMaster = CreateObject("Scripting.Dictionary")
    For r = 2 To LastRowM
        If Not dictMaster.exists(Master(r, 1)) Then
            dictMaster.Add Master(r, 1), Master(r, masterValCol)
        End If
    Next r

    '----------------------------
    ' ③ 差分チェック用 Dictionary
    '----------------------------
    LastRowO = wsOther.Cells(wsOther.Rows.Count, 1).End(xlUp).Row
    Other = wsOther.Range("A1:A" & LastRowO).Value
    Set dictOther = CreateObject("Scripting.Dictionary")
    For r = 2 To LastRowO
        dictOther(Other(r, 1)) = True
    Next r

    '----------------------------
    ' ④ 重複・SUMIF 用 Dictionary
    '----------------------------
    Set dictDup = CreateObject("Scripting.Dictionary")
    Set dictSum = CreateObject("Scripting.Dictionary")

    '----------------------------
    ' ⑤ 配列内で全処理
    '----------------------------
    For r = 2 To UBound(Data, 1)
        
        '------ マスタ結合(VLOOKUP代替) ------
        If dictMaster.exists(Data(r, keyCol)) Then
            Data(r, outputStartCol) = dictMaster(Data(r, keyCol))
        Else
            Data(r, outputStartCol) = "なし"
        End If

        '------ JOIN(キー列 + SUM列を連結) ------
        Data(r, outputStartCol + 1) = Data(r, keyCol) & "-" & Data(r, sumCol)

        '------ 差分チェック ------
        If dictOther.exists(Data(r, keyCol)) Then
            Data(r, outputStartCol + 2) = "一致"
        Else
            Data(r, outputStartCol + 2) = "差分"
        End If

        '------ 重複チェック ------
        If dictDup.exists(Data(r, keyCol)) Then
            Data(r, outputStartCol + 3) = "重複"
        Else
            dictDup(Data(r, keyCol)) = True
            Data(r, outputStartCol + 3) = ""
        End If

        '------ SUMIF 代替(キーごとの合計) ------
        If dictSum.exists(Data(r, keyCol)) Then
            dictSum(Data(r, keyCol)) = dictSum(Data(r, keyCol)) + Data(r, sumCol)
        Else
            dictSum(Data(r, keyCol)) = Data(r, sumCol)
        End If

    Next r

    '------ SUMIF 結果を配列に戻す(最後の列) ------
    For r = 2 To UBound(Data, 1)
        Data(r, outputStartCol + 4) = dictSum(Data(r, keyCol))
    Next r

    '----------------------------
    ' ⑥ 配列 → シートへ一括書き戻し
    '----------------------------
    ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol + 5)).Value = Data

    MsgBox "超汎用高速処理 完了!"

End Sub
VB

使い方(列指定だけでOK)

  1. Data シート
    • キー列と集計列を入力
  2. Master シート
    • キー列 + 取得したい値列
  3. Other シート
    • 差分比較したいキー列
  4. VBA 内の 列番号・シート名 を設定するだけ
    • keyCol : キー列
    • sumCol : SUM対象列
    • masterValCol : マスタから取得したい列
    • outputStartCol : 結果出力開始列(C列以降など)
  5. マクロを実行 → 数十万行でも瞬時に処理完了!

出力イメージ(Dataシート)

A列B列C列D列E列F列G列H列
キー数値マスタ名JOIN差分重複SUM
0015商品A001-5一致15
0023商品B002-3差分重複3

このテンプレは 完全ノーコードで列番号を指定するだけ なので、

  • 「列が増えた」「マスタが変わった」「差分先シートが変わった」
  • 「集計したい列が変わった」

すべて柔軟に対応できます。

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