Excel 実務では、同じ商品コード・同じ日付・同じ顧客IDなど、重複データが含まれる表を整理して「1行にまとめる」「集計して1件に統合する」といった作業が頻繁に発生します。Excel の標準機能だけでは手動作業になりがちな処理も、VBA を使えば高速に自動化でき、大量データでも確実に処理できるようになります。
特に売上データ・出荷データ・勤怠ログなどの業務データでは、重複行をまとめて一意データ化し、合計・最大値・最新日付を抽出する処理が欠かせません。手動でフィルターとコピーを繰り返すより、VBA でロジック化することで、再現性の高い業務フローを構築できます。
この記事では、重複データをまとめるためのVBA手法を体系的に整理し、複数列の条件でまとめる方法、Dictionary を使った高速集計、最新データの抽出、行の統合など実務で必要なパターンをすべてわかりやすく解説します。さらに、RPA や ChatGPT と組み合わせて業務を自動化する際の注意点や応用方法も紹介します。
目次
- ✅ 重複データをまとめるとは?実務で最も使われる“データ統合処理”
- ・重複データを「まとめる」目的とは
- ❗ Excel の標準機能「重複の削除」は“まとめる処理”には使えない
- ✅ 方法1:Dictionary を使って重複データをまとめる(最も実務向け)
- ・Dictionary を使うメリット
- 【サンプル①】同じIDの数量を合計して1行にまとめる
- ・処理のポイント
- 【応用1】複数列条件で重複をまとめる(商品コード+日付など)
- 【応用2】最新日付だけ残してまとめる
- 【応用3】行ごと統合(1行を丸ごと更新)
- 【応用4】合計・最大値・最小値などを組み合わせたまとめ処理
- 【実務例】売上データを商品コードごとにまとめる
- 例:元データ(A〜C列)
- 統合(E〜G列)
- ・まとめ処理のコード
- 【実務向け】配列を使って高速に重複データをまとめる
- 【サンプル②】配列+Dictionary の高速版
- 【注意点】重複データをまとめる際のよくある失敗
- ・失敗①:キーに空白が含まれてまとめられない
- ・失敗②:文字列と数値が混在して比較が狂う
- ・失敗③:同じ値でもスペースや改行で別物と判定される
- ・失敗④:日付を文字列として比較してしまう
- ・失敗⑤:出力先の範囲を確保していない
- ❗ ChatGPT で生成したコードでも重複処理は誤作動しやすい
- ❗ UiPath / Power Automate との連携でも重複処理は重要なポイント
- 【実務テンプレート】重複データをまとめて別シートに出力する
- 【応用】重複データを色付けして可視化
- 【応用】まとめる前に重複チェックだけする方法
- 【応用】重複項目のリストだけ抽出する
- 【応用】1列だけではなく複数列まとめ処理をシリーズ化できる
- 【総合例】重複データをまとめる処理を“1本のマクロ”に統合
- ✅ まとめ:重複データをまとめる処理は VBA の重要スキル
✅ 重複データをまとめるとは?実務で最も使われる“データ統合処理”
・重複データを「まとめる」目的とは
Excelでは同じキー(例:商品コード・顧客ID)が複数行に散らばっているケースが多く、以下のような作業が必要になります。
- 同じIDの行を1行に統合する
- 数量・金額を合計する
- 最新日付のデータだけ残す
- 重複行から特定の列だけ抽出する
- 複数列条件で重複判定してまとめる
これらは Excel のフィルターだけでは限界があり、手作業では時間がかかりミスも発生します。
❗ Excel の標準機能「重複の削除」は“まとめる処理”には使えない
標準機能は単純な「削除」であり、「まとめる」「集計」はできません。
例:
ID | 数量
A | 10
A | 5
標準機能:片方が削除される
VBA:10 + 5 = 15 に統合できる
だからこそ VBA が必要です。
✅ 方法1:Dictionary を使って重複データをまとめる(最も実務向け)
・Dictionary を使うメリット
- キー(ID)で自動的に重複排除
- 値を合計・更新・統合しやすい
- 大量データでも高速
- 複数列キーにも適用できる
実務では最も柔軟な方法です。
参考:【VBA】重複データを抽出する方法|複数列の重複判定と実務で使える抽出処理を徹底解説
【サンプル①】同じIDの数量を合計して1行にまとめる
Sub MergeDuplicateData()
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Dim ws As Worksheet
Dim result As Object
Set dic = CreateObject("Scripting.Dictionary")
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
key = ws.Cells(i, 1).Value ' ID
If dic.Exists(key) Then
dic(key) = dic(key) + ws.Cells(i, 2).Value ' 数量を合計
Else
dic.Add key, ws.Cells(i, 2).Value
End If
Next i
' 出力
Dim r As Long: r = 2
For Each key In dic.Keys
ws.Cells(r, 4).Value = key
ws.Cells(r, 5).Value = dic(key)
r = r + 1
Next key
End Sub
・処理のポイント
- Dictionary が自動で重複判定
- 値を累積すれば「合計」になる
- 出力先を変えれば別シートに統合も可能
【応用1】複数列条件で重複をまとめる(商品コード+日付など)
複数列を組み合わせてユニークキー化します。
key = ws.Cells(i, 1).Value & "_" & ws.Cells(i, 2).Value
組み合わせパターン:
- 顧客ID × 日付
- 商品コード × 店舗
- 社員ID × 勤務日
複合キーを使うと実務の多様な重複処理に対応できます。
参考:【Excel】重複削除を正しく行う方法|関数・フィルター・Power Queryを使いこなす実践ガイド
【応用2】最新日付だけ残してまとめる
「最も新しいデータ」を残す場合:
If dic.Exists(key) Then
If ws.Cells(i, 3).Value > dic(key)(1) Then ' 日付比較
dic(key) = Array(ws.Cells(i, 2).Value, ws.Cells(i, 3).Value)
End If
Else
dic.Add key, Array(ws.Cells(i, 2).Value, ws.Cells(i, 3).Value)
End If
配列で複数値を保持できます。
【応用3】行ごと統合(1行を丸ごと更新)
行全体を配列で管理すると柔軟になります。
【応用4】合計・最大値・最小値などを組み合わせたまとめ処理
業務では以下を同時に行うケースも多いです:
- 数量は合計
- 単価は最新の値
- 担当者名は最初の値
- 日付は最大値(最新)
VBA では条件ごとに分岐させるだけで実現できます。
【実務例】売上データを商品コードごとにまとめる
例:元データ(A〜C列)
| 商品 | 数量 | 金額 |
|---|---|---|
| A | 10 | 100 |
| A | 5 | 50 |
| B | 2 | 40 |
統合(E〜G列)
| 商品 | 数量合計 | 金額合計 |
|---|---|---|
| A | 15 | 150 |
| B | 2 | 40 |
・まとめ処理のコード
dic(key)(0) = dic(key)(0) + 数量
dic(key)(1) = dic(key)(1) + 金額
配列内で複数列を一括管理できます。
【実務向け】配列を使って高速に重複データをまとめる
大量データ(1万行以上)では、Worksheet への直接アクセスが遅くなります。
その場合、配列で読み込み → VBA のみで処理 → 最後に書き戻す
という方法が最速です。
【サンプル②】配列+Dictionary の高速版
Sub MergeByArray()
Dim dic As Object
Dim arr, out(), key As String
Dim i As Long, n As Long
Set dic = CreateObject("Scripting.Dictionary")
arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
For i = 1 To UBound(arr)
key = arr(i, 1)
If dic.Exists(key) Then
dic(key)(0) = dic(key)(0) + arr(i, 2)
dic(key)(1) = dic(key)(1) + arr(i, 3)
Else
dic.Add key, Array(arr(i, 2), arr(i, 3))
End If
Next i
配列版は大量データでも高速で、業務向けです。
【注意点】重複データをまとめる際のよくある失敗
・失敗①:キーに空白が含まれてまとめられない
→ Trim で事前処理
・失敗②:文字列と数値が混在して比較が狂う
例:商品コード “00123” が “123” と判定される
対策:
key = CStr(arr(i, 1))
・失敗③:同じ値でもスペースや改行で別物と判定される
Replace(value, vbCrLf, "")
などの前処理が重要。
・失敗④:日付を文字列として比較してしまう
→ CDate() を使う
・失敗⑤:出力先の範囲を確保していない
→ 現在の行数より多くなる場合は注意。
❗ ChatGPT で生成したコードでも重複処理は誤作動しやすい
ChatGPT のVBA生成ではよくある問題:
- Dictionary のキーに複数列を考慮していない
- Variant が混在しデータが壊れる
- 型宣言が曖昧でエラー
- 日付を文字列として比較してしまう
- 出力範囲のクリア忘れ
あなたのブログでは、
「AIで生成したVBAの改善ポイント」記事と組み合わせると滞在時間が伸びます。
❗ UiPath / Power Automate との連携でも重複処理は重要なポイント
RPAツールで Excel を扱う場合、重複処理は頻出。
- UiPath:データテーブルをDictionary化しやすい
- Power Automate:Excel内の重複処理が苦手
そのため、
「VBAで前処理 → RPAで自動化」
の流れをつくると業務全体が安定します。
【実務テンプレート】重複データをまとめて別シートに出力する
Sub ExportMergedData()
' Dictionaryでまとめたデータを"結果"シートへ
End Sub
読者が実務でそのまま使える形にすると滞在時間が伸びます。
【応用】重複データを色付けして可視化
まとめる前に、どのデータが重複しているか色で確認できます。
- 黄色:重複行
- 赤:完全重複
- 青:最新日付
可視化と組み合わせた記事も人気になります。
【応用】まとめる前に重複チェックだけする方法
Dictionary の .Exists(key) を利用すれば簡単です。
【応用】重複項目のリストだけ抽出する
出力する値を key のみにすると重複リストが完成します。
【応用】1列だけではなく複数列まとめ処理をシリーズ化できる
- 商品コード × 日付
- 顧客ID × 商品
- 社員ID × 日別勤務
- 部門 × 商品コード
記事シリーズとして育てられるテーマです。
【総合例】重複データをまとめる処理を“1本のマクロ”に統合
記事後半でテンプレート化するとユーザーが長く滞在します。
✅ まとめ:重複データをまとめる処理は VBA の重要スキル
この記事で解説した内容を整理します。
- 重複データをまとめるには Dictionary が最適
- 複数列キーを使えば実務データに対応
- 配列処理を組み合わせると高速
- 最新日付・合計値・最小値などの複数処理も可能
- エラーや混在データへの対策が重要
- Ai(ChatGPT)やRPAとの併用で実務全体の効率化につながる
- まとめ処理は売上データ・出荷データ・勤怠など業務のど真ん中で必要
VBAで重複データ処理が書けるようになると、
Excel業務の8割を自動化できると言っても過言ではありません。