ここからは 「列指定だけで完全ノーコード」+「マスタ結合・集計・差分・重複処理」対応の超汎用高速テンプレ」 を作ります。
初心者でもコピペして列指定するだけで使えるプロ仕様です。
特徴
- 列指定だけで操作可能 → 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)
- Data シート
- キー列と集計列を入力
- Master シート
- キー列 + 取得したい値列
- Other シート
- 差分比較したいキー列
- VBA 内の 列番号・シート名 を設定するだけ
keyCol: キー列sumCol: SUM対象列masterValCol: マスタから取得したい列outputStartCol: 結果出力開始列(C列以降など)
- マクロを実行 → 数十万行でも瞬時に処理完了!
出力イメージ(Dataシート)
| A列 | B列 | C列 | D列 | E列 | F列 | G列 | H列 |
|---|---|---|---|---|---|---|---|
| キー | 数値 | マスタ名 | JOIN | 差分 | 重複 | SUM | … |
| 001 | 5 | 商品A | 001-5 | 一致 | 15 | … | |
| 002 | 3 | 商品B | 002-3 | 差分 | 重複 | 3 | … |
このテンプレは 完全ノーコードで列番号を指定するだけ なので、
- 「列が増えた」「マスタが変わった」「差分先シートが変わった」
- 「集計したい列が変わった」
すべて柔軟に対応できます。


