VBAで自動化 VBA一覧 配列・データ操作 重複処理

【VBA】重複データを抽出する方法|複数列の重複判定と実務で使える抽出処理を徹底解説

Excelを日々扱っていると、「同じ顧客が複数回登場している行だけ抽出したい」「顧客コード+日付の組み合わせで重複している行を一覧化したい」といった場面がよくあります。Excelの標準機能でも重複チェックはできますが、「重複データだけ別シートへ抽出したい」「複数列の組み合わせを条件にしたい」となると標準機能では限界があり、手作業も煩雑になります。

そこで役立つのが VBAによる重複データ抽出の自動化 です。重複削除とは異なり、「削除はせず、抽出だけ行う」という処理は品質管理・データ検証・売上集計・名寄せ(データクレンジング)など、多くの場面で必要になります。

この記事では、重複データを抽出するための考え方から、実務で使えるVBAコード、複数列対応、高速化のためのDictionary活用、さらにChatGPTやRPAとの連携による効率化まで、丁寧に解説します。

目次

✅ 重複抽出をVBAで行う基本的な考え方|「一意判定」と「重複回数のカウント」

・重複抽出とは「1回目以降に登場したデータを拾う処理」

重複削除とは異なり、「同じデータが複数回出現した場合、2回目以降の行を抽出する」のが重複抽出の基本です。

例)顧客コードの一覧

A001  
A002  
A001 ←(重複行として抽出)  
A003  
A002 ←(重複行として抽出)

このように、1行目は「初回」、2回目以降が「重複」として扱われます。


・重複判定には「キーの作成」が最重要

1列だけなら値そのものがキーになりますが、複数列の場合は以下のように結合します:

顧客コード & "|" & 日付 & "|" & 商品コード

区切り文字「|」を使うことで誤判定を避けられます。


・Dictionaryは「登場済みかどうか」を判定するのに最適

重複抽出では次のように辞書(Dictionary)を使います:

  1. まだ登場していないキー → Dictionaryに登録(初回)
  2. すでに存在するキー → 重複として抽出(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

・複数列対応のポイント




✅ 動的な列指定で複数列重複抽出(柔軟性の高いコード)

列数が変わるデータを扱いたい場合は以下が便利です。

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業務の品質向上・自動化にぜひ役立ててください。

    -VBAで自動化, VBA一覧, 配列・データ操作, 重複処理