Excelで大量のデータを扱っていると、「重複している行を削除したい」「同じ顧客+日付+商品コードの行だけ削除したい」「複数列の値が一致している行を1つだけ残したい」といった場面が頻繁に発生します。Excel標準機能でも重複削除はできますが、「この条件だけ残したい」「複数列の重複を自動化したい」「月次ファイルごとに同じ処理を繰り返したい」など、より高度な要望が出ると手動操作では限界があります。
そこで活躍するのが VBAによる重複削除の自動化 です。特に複数列の組み合わせで重複判定を行う処理は、実務におけるデータ整形の核心部分であり、VBAを使うことで圧倒的に効率化できます。
この記事では、複数列の重複削除を セル単位 と 行単位 の両方で実装する方法を、初心者にも分かりやすく丁寧に解説します。辞書(Dictionary)を使った高速処理や、実務上よくあるパターン、ChatGPTを使ったコード改善の例、RPA活用との相性についても触れ、滞在時間を伸ばしつつしっかり理解できる内容に仕上げています。
目次
- ✅ VBAで複数列の重複を削除する基本|「キーの組み合わせ」で行を判定する考え方
- ・複数列の重複削除は「行全体の一致判定」が基本になる
- ・セル単位の重複削除と行単位の重複削除の違い
- ✅ セル単位の重複削除をVBAで行う基本コード
- ・最も簡単な「RemoveDuplicates」を使う方法
- 仕組み
- ❗ セル単位の重複削除では実務に対応できないケースが多い
- ✅ 行単位の複数列重複削除|Dictionaryを使った高速処理
- ・複数列の値を組み合わせて“キー”を作る考え方
- ✅ 複数列の重複削除(行単位) VBAコード(実務向け)
- ・コードのポイント解説
- ✅ 列数が多い場合の重複削除(柔軟なコード)
- ✅ 重複削除のバリエーション|実務で多いケース別コード集
- ・パターン1:最新日付だけ残す
- ・パターン2:削除ではなく、重複行だけ別シートへ出力
- ・パターン3:重複件数をカウントして一覧表を作成
- ・パターン4:Excel標準機能「RemoveDuplicates」と組み合わせる
- ✅ ChatGPTを使った重複削除ロジックの自動生成が実務で強力
- ✅ RPA(UiPath / Power Automate Desktop)との連携でも役立つ
- ❗ 重複削除を行う際の注意点
- ・削除前にバックアップを取る
- ・上から削除すると行番号がズレる
- ・結合セルはエラーを引き起こす可能性がある
- ・キーとなる列は明確に記録しておく
- ❗ よくある質問(Q&A)
- Q1:RemoveDuplicates と Dictionary、どちらがよい?
- Q2:処理が遅いのですが?
- Q3:重複行は削除せずマークだけ付けたい
- ✅ まとめ:複数列の重複削除は「キーの組み合わせ」が最重要
✅ VBAで複数列の重複を削除する基本|「キーの組み合わせ」で行を判定する考え方
・複数列の重複削除は「行全体の一致判定」が基本になる
複数列の重複を削除するときに重要なのは、
行の中から“一致条件となる列”を取り出して一つの「キー」へ結合する
という考え方です。
例)
- A列:顧客コード
- B列:日付
- C列:商品コード
この3つが同じなら“重複行”とみなす場合は、
顧客コード & "|" & 日付 & "|" & 商品コード
のように一つの文字列(キー)にまとめます。
VBAではこの「キー」を使って行を判定していくのが最も実用的で安定した方法です。
・セル単位の重複削除と行単位の重複削除の違い
セル単位の重複削除:
- 1つの列だけを対象に重複削除する
- 手軽だが、行全体の重複は判定できない
- 例:顧客コードだけ重複していたら削除
行単位の重複削除:
- 複数列を組み合わせて判定
- 実務ではこちらの方が圧倒的に需要が高い
- 例:顧客×商品×日付が完全一致している行を削除
この記事では両方の考え方を解説した後、行単位の実務向けVBAコードを紹介します。
✅ セル単位の重複削除をVBAで行う基本コード
・最も簡単な「RemoveDuplicates」を使う方法
Excel標準の「重複の削除」機能をVBAから呼び出す方法です。
Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
仕組み
- CurrentRegion で表全体を取得
- Columns:=1 で「A列だけを重複判定」に指定
- Header:=xlYes で1行目が見出しであることを指定
セル単位の重複削除としては最も手軽です。
❗ セル単位の重複削除では実務に対応できないケースが多い
業務では以下のような要望が多く、セル単位では対応できません。
- 顧客 + 日付 + 商品コード の組み合わせで重複削除したい
- 最新の更新日時だけ残して重複レコードを削除したい
- ある列は一致していなくても良い(例:備考は無視)
- 重複行を削除ではなく、別シートに抽出したい
そのため 複数列の行単位の重複削除 が必要になります。
参考:【VBA】不要データを一括削除する方法|空欄行・エラー行・重複行をまとめて整理
✅ 行単位の複数列重複削除|Dictionaryを使った高速処理
・複数列の値を組み合わせて“キー”を作る考え方
Dictionary(連想配列)は重複判定に最適で、以下のように使います。
- 重複判定する列の値を連結してキーを作る
- Dictionaryにキーが存在しなければ追加し、存在する場合は重複と判定
- 重複行を削除する
✅ 複数列の重複削除(行単位) 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とも連携しやすい
- 実務では「最新行だけ残す」「重複行を抽出」のニーズも多い
重複削除は一度仕組みを理解すれば、あらゆるデータ整形に応用できます。