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

【VBA】複数列の重複削除する方法|セル単位・行単位で処理する実務向けテクニック

Excelで大量のデータを扱っていると、「重複している行を削除したい」「同じ顧客+日付+商品コードの行だけ削除したい」「複数列の値が一致している行を1つだけ残したい」といった場面が頻繁に発生します。Excel標準機能でも重複削除はできますが、「この条件だけ残したい」「複数列の重複を自動化したい」「月次ファイルごとに同じ処理を繰り返したい」など、より高度な要望が出ると手動操作では限界があります。

そこで活躍するのが VBAによる重複削除の自動化 です。特に複数列の組み合わせで重複判定を行う処理は、実務におけるデータ整形の核心部分であり、VBAを使うことで圧倒的に効率化できます。

この記事では、複数列の重複削除を セル単位行単位 の両方で実装する方法を、初心者にも分かりやすく丁寧に解説します。辞書(Dictionary)を使った高速処理や、実務上よくあるパターン、ChatGPTを使ったコード改善の例、RPA活用との相性についても触れ、滞在時間を伸ばしつつしっかり理解できる内容に仕上げています。

目次

✅ VBAで複数列の重複を削除する基本|「キーの組み合わせ」で行を判定する考え方

・複数列の重複削除は「行全体の一致判定」が基本になる

複数列の重複を削除するときに重要なのは、
行の中から“一致条件となる列”を取り出して一つの「キー」へ結合する
という考え方です。

例)

  • A列:顧客コード
  • B列:日付
  • C列:商品コード

この3つが同じなら“重複行”とみなす場合は、

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

のように一つの文字列(キー)にまとめます。

VBAではこの「キー」を使って行を判定していくのが最も実用的で安定した方法です。


・セル単位の重複削除と行単位の重複削除の違い

セル単位の重複削除:

  • 1つの列だけを対象に重複削除する
  • 手軽だが、行全体の重複は判定できない
  • 例:顧客コードだけ重複していたら削除

行単位の重複削除:

  • 複数列を組み合わせて判定
  • 実務ではこちらの方が圧倒的に需要が高い
  • 例:顧客×商品×日付が完全一致している行を削除

この記事では両方の考え方を解説した後、行単位の実務向けVBAコードを紹介します。


✅ セル単位の重複削除をVBAで行う基本コード

・最も簡単な「RemoveDuplicates」を使う方法

Excel標準の「重複の削除」機能をVBAから呼び出す方法です。

Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes

仕組み

  1. CurrentRegion で表全体を取得
  2. Columns:=1 で「A列だけを重複判定」に指定
  3. Header:=xlYes で1行目が見出しであることを指定

セル単位の重複削除としては最も手軽です。


❗ セル単位の重複削除では実務に対応できないケースが多い

業務では以下のような要望が多く、セル単位では対応できません。

  • 顧客 + 日付 + 商品コード の組み合わせで重複削除したい
  • 最新の更新日時だけ残して重複レコードを削除したい
  • ある列は一致していなくても良い(例:備考は無視)
  • 重複行を削除ではなく、別シートに抽出したい

そのため 複数列の行単位の重複削除 が必要になります。

参考:【VBA】不要データを一括削除する方法|空欄行・エラー行・重複行をまとめて整理


✅ 行単位の複数列重複削除|Dictionaryを使った高速処理

・複数列の値を組み合わせて“キー”を作る考え方

Dictionary(連想配列)は重複判定に最適で、以下のように使います。

  1. 重複判定する列の値を連結してキーを作る
  2. Dictionaryにキーが存在しなければ追加し、存在する場合は重複と判定
  3. 重複行を削除する



✅ 複数列の重複削除(行単位) VBAコード(実務向け)

以下は、A〜C列の値を組み合わせて重複削除する例です。

Sub DeleteDuplicateRows_MultiColumns()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim dic As Object
    Dim key As String
    Dim i As Long

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Set dic = CreateObject("Scripting.Dictionary")

    ' 下からループして削除する
    For i = lastRow To 2 Step -1
        
        key = ws.Cells(i, "A").Value & "|" & _
              ws.Cells(i, "B").Value & "|" & _
              ws.Cells(i, "C").Value
        
        If dic.Exists(key) Then
            ws.Rows(i).Delete
        Else
            dic.Add key, 1
        End If

    Next i

End Sub

・コードのポイント解説

① 下から処理する理由

行削除すると番号が詰まるため、上から処理するとスキップが起こる。
下から削除すれば安全。

② キーに区切り文字「|」を使う理由

例えば以下は同じに見える:

11 と 2(→ "112")  
1 と 12(→ "112")

区切り文字を使うことで誤判定を防げる。

③ 辞書で高速化

大型データでも安定して処理できるため、実務では必須。

参考:【VBA】変数宣言とは?基本構文・データ型・スコープの考え方まで徹底解説!


✅ 列数が多い場合の重複削除(柔軟なコード)

列数が動的に増えるデータを扱うこともあります。

以下は、任意の列番号配列を使ってキーを生成する方法です。

Sub DeleteDuplicatesFlexible()

    Dim ws As Worksheet
    Dim cols As Variant
    Dim lastRow As Long
    Dim dic As Object
    Dim key As String
    Dim i As Long
    Dim c As Variant

    Set ws = ActiveSheet

    ' 判定に使う列番号(例:A=1, C=3, E=5)
    cols = Array(1, 3, 5)

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Set dic = CreateObject("Scripting.Dictionary")

    For i = lastRow To 2 Step -1
    
        key = ""
        For Each c In cols
            key = key & ws.Cells(i, c).Value & "|"
        Next c
        
        If dic.Exists(key) Then
            ws.Rows(i).Delete
        Else
            dic.Add key, 1
        End If

    Next i

End Sub

✅ 重複削除のバリエーション|実務で多いケース別コード集

・パターン1:最新日付だけ残す

例:顧客 + 商品 をキーにし、日付が最大の行だけ残したい
この場合は、辞書に「日付も一緒に格納して比較する」方法を使います。


・パターン2:削除ではなく、重複行だけ別シートへ出力

品質管理など、「削除はNGだがチェックはしたい」ケースでよく使います。


・パターン3:重複件数をカウントして一覧表を作成

COUNTIFでは時間がかかる大規模データで役立ちます。


・パターン4:Excel標準機能「RemoveDuplicates」と組み合わせる

「前処理 → VBAで最終調整」という流れは実務で非常に多いです。


✅ ChatGPTを使った重複削除ロジックの自動生成が実務で強力

最近は ChatGPT を使って、

  • 複数列の重複判定ロジックの生成
  • 列が可変のときのコード修正
  • ワークシート名ごとの処理ブロック作成
  • 条件付きの重複削除(例:売上0円は対象外)

などを自動的に書かせることができます。

しかし ChatGPT が生成したコードは以下の点で不完全なこともあります:

  • 辞書のキー連結が曖昧
  • Delete 処理が上からになっている
  • Variant型の使いすぎ
  • シート参照が曖昧で落ちやすい
  • 巨大データに対して非効率

そのため あなた自身が「重複削除の仕組み」を理解していることが重要 です。

この記事の内容を理解していれば、ChatGPTが作ったコードも自分でチェックし、
実務向けに最適化できます。


✅ RPA(UiPath / Power Automate Desktop)との連携でも役立つ

RPAでは次のようなデータ前処理を求められるケースが多いです:

  • Excelの一覧から重複行を除外
  • 最新行だけ残す
  • 重複データを別ファイルに分ける
  • キーの総当たりチェックを行う

VBAで重複削除ロジックを安定化させておくことで、
RPA側のフローが大幅に簡略化されます。


❗ 重複削除を行う際の注意点

・削除前にバックアップを取る

復元できなくなるため、実務では最重要。

・上から削除すると行番号がズレる

必ず下からループする。

・結合セルはエラーを引き起こす可能性がある

実務では結合セルを使わない方が安全。

・キーとなる列は明確に記録しておく

誤った列を重複判定に使うと重大なミスになる。


❗ よくある質問(Q&A)

Q1:RemoveDuplicates と Dictionary、どちらがよい?

  • 手軽:RemoveDuplicates
  • 柔軟かつ高速:Dictionary
    実務では Dictionary の方が圧倒的に使われます。

Q2:処理が遅いのですが?

  • ScreenUpdating のOFF
  • Variant配列で読み込み
  • 辞書を使用
    などを行うと劇的に改善します。

Q3:重複行は削除せずマークだけ付けたい

→「重複行の判定列」にフラグを書く処理にすればOK。


✅ まとめ:複数列の重複削除は「キーの組み合わせ」が最重要

複数列を使った重複削除は、Excel業務の効率化で最も重要な技術の一つです。

  • セル単位の重複は RemoveDuplicates で手軽に処理
  • 行単位の重複は Dictionary で高速・柔軟に削除
  • キー(顧客×日付×商品など)の設計が重要
  • 下から削除するのが安全
  • ChatGPT のコード生成と相性がよく、RPAとも連携しやすい
  • 実務では「最新行だけ残す」「重複行を抽出」のニーズも多い

重複削除は一度仕組みを理解すれば、あらゆるデータ整形に応用できます。

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