Excelを日々扱っていると、「同じ顧客が複数回登場している行だけ抽出したい」「顧客コード+日付の組み合わせで重複している行を一覧化したい」といった場面がよくあります。Excelの標準機能でも重複チェックはできますが、「重複データだけ別シートへ抽出したい」「複数列の組み合わせを条件にしたい」となると標準機能では限界があり、手作業も煩雑になります。
そこで役立つのが VBAによる重複データ抽出の自動化 です。重複削除とは異なり、「削除はせず、抽出だけ行う」という処理は品質管理・データ検証・売上集計・名寄せ(データクレンジング)など、多くの場面で必要になります。
この記事では、重複データを抽出するための考え方から、実務で使えるVBAコード、複数列対応、高速化のためのDictionary活用、さらにChatGPTやRPAとの連携による効率化まで、丁寧に解説します。
目次
- ✅ 重複抽出をVBAで行う基本的な考え方|「一意判定」と「重複回数のカウント」
- ・重複抽出とは「1回目以降に登場したデータを拾う処理」
- ・重複判定には「キーの作成」が最重要
- ・Dictionaryは「登場済みかどうか」を判定するのに最適
- ✅ 単一列の重複データを抽出するVBAコード(基礎)
- ・実務でよくある活用例
- ✅ 複数列の重複を抽出するVBAコード(実務向け|行単位処理)
- ・複数列対応のポイント
- ✅ 動的な列指定で複数列重複抽出(柔軟性の高いコード)
- ・この方法のメリット
- ✅ 重複抽出に関連する実務でよくあるパターン
- ・パターン1:重複行を色付けして可視化
- ・パターン2:最新日付の行だけ抽出
- ・パターン3:重複行だけ削除したい
- ・パターン4:重複件数をカウントしたい
- ・パターン5:重複パターンごとにまとめて出力
- ❗ 重複抽出を行う際の注意点
- ・抽出データが膨大になる場合がある
- ・結合セルがあると誤判定が起きる
- ・キーに使う列は慎重に選ぶ
- ❗ ChatGPTを活用すると重複抽出コードの改善が高速化する
- ❗ RPA(UiPath / PAD)と重複抽出は非常に相性がよい
- 【事例】重複抽出を導入して業務が改善した例
- ❗ よくあるQ&A
- Q:抽出先を既存シートにしたい
- Q:重複した1回目の登場行も抽出したい
- Q:抽出結果をCSVとして保存したい
- ✅ まとめ:重複抽出は辞書とキー設計が最重要ポイント
✅ 重複抽出をVBAで行う基本的な考え方|「一意判定」と「重複回数のカウント」
・重複抽出とは「1回目以降に登場したデータを拾う処理」
重複削除とは異なり、「同じデータが複数回出現した場合、2回目以降の行を抽出する」のが重複抽出の基本です。
例)顧客コードの一覧
A001
A002
A001 ←(重複行として抽出)
A003
A002 ←(重複行として抽出)
このように、1行目は「初回」、2回目以降が「重複」として扱われます。
・重複判定には「キーの作成」が最重要
1列だけなら値そのものがキーになりますが、複数列の場合は以下のように結合します:
顧客コード & "|" & 日付 & "|" & 商品コード
区切り文字「|」を使うことで誤判定を避けられます。
・Dictionaryは「登場済みかどうか」を判定するのに最適
重複抽出では次のように辞書(Dictionary)を使います:
- まだ登場していないキー → Dictionaryに登録(初回)
- すでに存在するキー → 重複として抽出(2回目以降)
辞書は検索が高速なため、大量データでも実務で安定して動作します。
✅ 単一列の重複データを抽出するVBAコード(基礎)
まずは1列の重複を抽出する基本コードです。
Sub ExtractDuplicates_OneColumn()
Dim ws As Worksheet
Dim wsOut As Worksheet
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Dim outputRow As Long
Set ws = ActiveSheet
Set dic = CreateObject("Scripting.Dictionary")
' 抽出先シートを作成
Set wsOut = Worksheets.Add
wsOut.Name = "重複抽出結果"
outputRow = 2
' 見出し行をコピー
ws.Rows(1).Copy wsOut.Rows(1)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
key = ws.Cells(i, "A").Value
If dic.Exists(key) Then
ws.Rows(i).Copy wsOut.Rows(outputRow)
outputRow = outputRow + 1
Else
dic.Add key, 1
End If
Next i
End Sub
・実務でよくある活用例
- 顧客コードの重複チェック
- 商品コードの二重登録確認
- 社員番号の重複検証
- 売上データの二重投入を発見する
これだけでも頻繁に使われる強力なツールになります。
✅ 複数列の重複を抽出するVBAコード(実務向け|行単位処理)
以下は A列+B列+C列 の組み合わせで重複行を抽出する実務向けコードです。
Sub ExtractDuplicates_MultiColumns()
Dim ws As Worksheet
Dim wsOut As Worksheet
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Dim outputRow As Long
Set ws = ActiveSheet
Set dic = CreateObject("Scripting.Dictionary")
' 抽出結果用シートを新規作成
Set wsOut = Worksheets.Add
wsOut.Name = "重複抽出結果"
outputRow = 2
ws.Rows(1).Copy wsOut.Rows(1)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
key = ws.Cells(i, 1).Value & "|" & _
ws.Cells(i, 2).Value & "|" & _
ws.Cells(i, 3).Value
If dic.Exists(key) Then
ws.Rows(i).Copy wsOut.Rows(outputRow)
outputRow = outputRow + 1
Else
dic.Add key, 1
End If
Next i
End Sub
・複数列対応のポイント
- キー生成のルールを統一する
- 順番を必ず固定する
- 区切り文字が重要(誤判定防止)
- 抽出先のシートを毎回リセットしておくと安全
- 下ではなく「上から」ループする(削除しないため)
参考:【VBA】複数列の重複削除する方法|セル単位・行単位で処理する実務向けテクニック
✅ 動的な列指定で複数列重複抽出(柔軟性の高いコード)
列数が変わるデータを扱いたい場合は以下が便利です。
Sub ExtractDuplicates_Flexible()
Dim ws As Worksheet
Dim wsOut As Worksheet
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim cols As Variant
Dim key As String
Dim c As Variant
Dim outputRow As Long
Set ws = ActiveSheet
Set dic = CreateObject("Scripting.Dictionary")
' 判定に使用する列番号の配列例
cols = Array(1, 2, 5) ' A列, B列, E列
Set wsOut = Worksheets.Add
wsOut.Name = "重複抽出結果"
outputRow = 2
ws.Rows(1).Copy wsOut.Rows(1)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
key = ""
For Each c In cols
key = key & ws.Cells(i, c).Value & "|"
Next c
If dic.Exists(key) Then
ws.Rows(i).Copy wsOut.Rows(outputRow)
outputRow = outputRow + 1
Else
dic.Add key, 1
End If
Next i
End Sub
・この方法のメリット
- 判断に使う列を簡単に変えられる
- 管理しやすいコード構造
- システム部門やRPA担当者にも共有しやすい
✅ 重複抽出に関連する実務でよくあるパターン
重複抽出はさまざまな目的で使われます。
・パターン1:重複行を色付けして可視化
ws.Rows(i).Interior.Color = vbYellow
品質管理チェックでよく使われます。
・パターン2:最新日付の行だけ抽出
注文履歴や入金履歴の整形で需要が多い。
・パターン3:重複行だけ削除したい
→ 本記事の派生として「重複削除マクロ」と組み合わせる。
・パターン4:重複件数をカウントしたい
dic(key) = dic(key) + 1
などのように辞書でカウントできる。
参考:【Excel】重複データを抽出し件数をカウントする方法|関数・ピボット・Power Queryを活用した集計テクニック
・パターン5:重複パターンごとにまとめて出力
顧客別・商品別チェックで便利。
❗ 重複抽出を行う際の注意点
・抽出データが膨大になる場合がある
→ 一度抽出が正しいか目視で確認するのが安全。
・結合セルがあると誤判定が起きる
→ 事前に結合セルを解除しておく。
・キーに使う列は慎重に選ぶ
業務ミスを防ぐ最も重要なポイント。
❗ ChatGPTを活用すると重複抽出コードの改善が高速化する
ChatGPTに以下を伝えると、すぐに実務向けコードが生成できます。
- 使用する列番号
- 抽出先シート名
- 抽出条件
- フィルタ基準
- RPAとの連携要件
ただし ChatGPT が生成するコードは以下の課題があることがあります:
- キー結合が甘い
- 削除と混在させて誤動作
- Variant型を多用
- 動的列対応していない
この記事のコードを理解していれば、自動生成したコードの改善も簡単です。
❗ RPA(UiPath / PAD)と重複抽出は非常に相性がよい
RPA側で重複検出を行うと:
- 処理が遅い
- 条件分岐が複雑
- Excel依存が強くなる
となるため、VBA側で抽出処理を完結させるのが理想です。
システム化の現場では
「Excel → VBAで重複抽出 → RPAで後続処理」
という構成が最も安定します。
【事例】重複抽出を導入して業務が改善した例
- 月次売上の二重計上チェックが5分 → 5秒へ
- 顧客リストの名寄せ作業が正確かつ高速に
- 営業日報の重複提出のチェックを完全自動化
- システム移行時のデータ整形で活用
Excelのデータ品質が上がることで、部署全体の業務がスムーズになります。
❗ よくあるQ&A
Q:抽出先を既存シートにしたい
→ Rows(2) 以降に上書きコピーするよう調整できます。
Q:重複した1回目の登場行も抽出したい
→ dic.Add の前にコピー処理を入れれば可能。
Q:抽出結果をCSVとして保存したい
→ VBAの「SaveAs」で容易に実装可能。
✅ まとめ:重複抽出は辞書とキー設計が最重要ポイント
最後にこの記事のポイントを整理します。
- 重複抽出は「2回目以降の登場行を拾う」処理
- 複数列の重複判定は「キーの結合」が最重要
- Dictionaryを使うことで高速かつ安定した抽出が可能
- 動的列対応コードで汎用性が大幅にアップ
- ChatGPTでのコード生成と相性がよい
- RPAとの連携で自動化の幅が広がる
重複抽出は、多くのデータ処理の基盤となる重要な技術です。
この記事のコードを活用し、Excel業務の品質向上・自動化にぜひ役立ててください。