Excel業務では、売上データ・顧客データ・勤怠データなどで「複数列による重複削除」が必要になるケースが非常に多くあります。例えば次のような場面です。
- 商品コード × 日付 の組み合わせが同じ行を削除したい
- 社員ID × 勤務日の重複を除去したい
- 顧客番号 × 購入日が重複して登録されている
- 店舗コード × 商品 の重複行だけまとめたい
Excelの「重複の削除」機能でも複数列を指定することはできますが、
- 毎回手動で指定する必要がある
- 毎回フィルタを解除する必要がある
- シート構成が変わると操作ミスが起きやすい
- 大量データだと非常に重くなる
という欠点があります。
このような問題を解決するのが VBAによる複数条件の重複削除 です。
VBAでは、複数列の値を組み合わせた「複合キー」を使うことで、
どんな複雑な条件でも高速かつ正確に重複を削除できます。
この記事では、複数条件での重複削除の考え方から、初心者向けのシンプルな方法、実務向けのDictionaryを使った高速処理、大量データ向けの配列処理まで 完全体系化した記事 を解説します。
目次
- ✅ 重複削除を複数条件で行うとは?複合キーで行レベルの一意性を管理する
- ・複数列の値を組み合わせて“1つのキー”として扱う
- ・なぜ複合キーが必要なのか?
- ・VBAでは「組み合わせ=文字列化」し比較するのが基本
- ✅ 複数条件の重複削除で使う主なVBA手法(3種類)
- ✅ 方法1:RemoveDuplicates(Excel標準機能)をVBAで呼び出す
- ・最も簡単に複数条件で重複削除ができる標準関数
- 【サンプル①】複数列(A列 & B列)の重複削除
- ・Columns:=Array(1,2) が複数条件の指定
- ✅ 方法2:Dictionaryで複合キーを使った重複削除(実務で最も強力)
- ・Dictionaryとは「キーの重複を許さないデータ構造」
- 【サンプル②】複数条件(A列×B列)の重複削除
- ・ポイント解説
- 【サンプル③】複数列を配列でまとめて扱う(3列以上)
- 【応用】複数条件で「最新の日付だけ残す」などの応用も簡単
- 【応用サンプル】最新日付だけ残す
- ❗ Dictionaryで重複削除をする際の注意点(必ず読んでほしい)
- ✅ 方法3:配列で重複削除(10万行以上の大量データ向け)
- 【サンプル④】配列+Dictionaryで複数条件重複削除(高速処理)
- 🧠 複数条件の重複削除を実務で成功させるための重要ポイント(プロの視点)
- ✅ RemoveDuplicates vs Dictionary vs 配列(どれが最適か?)
- 🧠 RPA(UiPath / Power Automate)での前処理にも最適
- 🧠 ChatGPT と組み合わせるとさらに便利
- 【実務用テンプレート】複数条件で重複削除(最も汎用性が高いコード)
- 🔍 複合条件として使われることが多い組み合わせ(実務例)
- 🟥 よくある誤判定と防止策
- 🧩 実務で使える応用例:削除ではなく「重複抽出」する
- 【サンプル】複数列の重複行を抽出する
- 📌 複数条件の重複削除は“前処理”として最も重要
- ✅ まとめ:複数条件の重複削除はDictionaryが最強。大量データでは配列が必須。
✅ 重複削除を複数条件で行うとは?複合キーで行レベルの一意性を管理する
・複数列の値を組み合わせて“1つのキー”として扱う
例えば A列「商品コード」、B列「日付」の場合:
| A列 | B列 |
|---|---|
| A001 | 2024/01/01 |
| A001 | 2024/01/01 |
| A002 | 2024/01/05 |
これを1列として考えるのではなく、
A列 & "_" & B列 のように結合して1つのキーとして扱う
ことで、複数列が一致する行を重複として検出できます。
・なぜ複合キーが必要なのか?
実務データでは「1つの列が一意とは限らない」ためです。
例:
- 商品コードだけでは重複あり
- ただし “商品コード × 日付” なら一意
- 社員IDだけでは重複あり
- ただし “社員ID × 勤務日” なら一意
現場ではほぼ必ず複数条件で重複判定するケースがあります。
・VBAでは「組み合わせ=文字列化」し比較するのが基本
複数列を結合して1つの文字列にすることで、比較が簡単になり、
Dictionaryなど高速処理との相性も良くなります。
✅ 複数条件の重複削除で使う主なVBA手法(3種類)
- RemoveDuplicates を使う方法(最も簡単)
- Dictionary を使う方法(実務で最も多い)
- 配列を使った大量データ高速処理(上級)
この記事ではすべての方法を実務レベルで解説します。
参考:【VBA】If文の複数条件をリストで判定する方法|効率的な条件分岐の書き方と応用
✅ 方法1:RemoveDuplicates(Excel標準機能)をVBAで呼び出す
・最も簡単に複数条件で重複削除ができる標準関数
Excelの「重複の削除」をVBAから実行する方法です。
【サンプル①】複数列(A列 & B列)の重複削除
Sub RemoveDuplicatesMulti()
Range("A1:B1000").RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
End Sub
・Columns:=Array(1,2) が複数条件の指定
1 → A列
2 → B列
を意味します。
・メリット
- コードが短い
- 初心者でも簡単
- Excel標準機能の動作と一致
・デメリット
- シート構造が変わると壊れやすい
- 大量データでは非常に遅い
- 条件の柔軟性が低い
- 削除した行は戻せない
- “削除前にチェック”ができない
実務では「RemoveDuplicatesだけで済むケース」は少なめです。
✅ 方法2:Dictionaryで複合キーを使った重複削除(実務で最も強力)
・Dictionaryとは「キーの重複を許さないデータ構造」
Dictionaryは、一意性チェックが非常に高速なため、重複削除に最適です。
【サンプル②】複数条件(A列×B列)の重複削除
Sub DeleteDuplicates_Dic()
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
key = CStr(Cells(i, 1).Value) & "|" & CStr(Cells(i, 2).Value)
If dic.Exists(key) Then
Rows(i).Delete
Else
dic.Add key, True
End If
Next i
End Sub
・ポイント解説
key = A列 & "|" & B列が複数条件の重複判定- CStrで文字列化し比較を安定させる
- "|"(パイプ)を区切りにすることで誤判定防止
- 下から削除(Step -1)で行ズレ防止
・メリット(RemoveDuplicatesより優れている点)
- 行削除の順序を制御できる
- 条件に柔軟に対応
- 大量データでも高速
- 削除前にチェック可能
- 最初の行だけ残すなど制御しやすい
実務で複数条件の重複削除を行うとき、最も利用される方法です。
参考:【VBA】複数列の重複削除する方法|セル単位・行単位で処理する実務向けテクニック
【サンプル③】複数列を配列でまとめて扱う(3列以上)
key = CStr(Cells(i, 1).Value) & "_" & _
CStr(Cells(i, 2).Value) & "_" & _
CStr(Cells(i, 3).Value)
・注意点
キーが長くなるため、
- Trim
- Replace
- 全角半角統一(StrConv)
など事前整形をすると精度が向上します。
【応用】複数条件で「最新の日付だけ残す」などの応用も簡単
Dictionaryは値(Item)に「行番号」や「日付」を保持できるため、次のような処理も可能になります。
- 最新データだけ残す
- 最大値・最小値で重複行を選択
- 商品コード × 店舗コード × 日付の複雑な重複判定
RemoveDuplicatesにはない強力な機能です。
【応用サンプル】最新日付だけ残す
If dic.Exists(code) Then
If Cells(i, 3).Value > Cells(dic(code), 3).Value Then
Rows(dic(code)).Delete
dic(code) = i
Else
Rows(i).Delete
End If
Else
dic.Add code, i
End If
❗ Dictionaryで重複削除をする際の注意点(必ず読んでほしい)
- CStrで文字列化しないと型の違いで誤判定する
- NULL値や空白の処理を統一する必要がある
- 文字列結合はTrim/Replaceなど前処理をした方が良い
- Dictionaryはキー重複が禁止 → 複合キー必須
✅ 方法3:配列で重複削除(10万行以上の大量データ向け)
大量データでは、シート上を直接ループするよりも、
配列に読み込んで処理する方が圧倒的に高速です。
【サンプル④】配列+Dictionaryで複数条件重複削除(高速処理)
Sub DeleteDuplicates_Array()
Dim dic As Object
Dim arr, i As Long, lastRow As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:C" & lastRow).Value
For i = UBound(arr) To 1 Step -1
key = CStr(arr(i, 1)) & "|" & CStr(arr(i, 2))
If dic.Exists(key) Then
Rows(i + 1).Delete
Else
dic.Add key, True
End If
Next i
End Sub
配列で処理すると高速化が期待できます。
🧠 複数条件の重複削除を実務で成功させるための重要ポイント(プロの視点)
・結合キーは必ず文字列化する
・前後空白はTrimで除去
・全角/半角違いはStrConvで統一
・日時比較ではCDateが必須
・削除処理は必ず下から実行する
・複数列は区切り文字を付けて誤判定を防ぐ
これらを徹底すると誤削除が防止でき、精度が高く安定した処理になります。
✅ RemoveDuplicates vs Dictionary vs 配列(どれが最適か?)
| 方法 | 特徴 | 速度 | 柔軟性 | 実務向け |
|---|---|---|---|---|
| RemoveDuplicates | 最も簡単 | △ | × | △ |
| Dictionary | 速くて柔軟・最も実務的 | ◎ | ◎ | ◎ |
| 配列+Dictionary | 大量データで最強 | ◎◎ | ◎ | ◎◎ |
結論:
複数条件での重複削除は Dictionary が最適。
10万行以上では配列+Dictionary が最強。
🧠 RPA(UiPath / Power Automate)での前処理にも最適
RPA では Excel の重複処理が非常に遅くなるため、
前処理として VBA で複数条件の重複削除をしておくと:
- RPA処理の高速化
- 誤判定の減少
- エラー回避
- データ品質の向上
など、業務効率が大幅に改善されます。
RPA × VBA の組み合わせは、多くの企業で採用されています。
🧠 ChatGPT と組み合わせるとさらに便利
ChatGPT に「複数条件の重複削除コードを生成」させる際も、
この記事で解説したポイント(複合キー、CStr、Trim、削除は下から、など)を指定すると
非常に正確なコードが生成できます。
【実務用テンプレート】複数条件で重複削除(最も汎用性が高いコード)
Sub DeleteDuplicate_MultiColumn()
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
key = CStr(Trim(Cells(i, 1).Value)) _
& "|" & CStr(Trim(Cells(i, 2).Value)) _
& "|" & CStr(Trim(Cells(i, 3).Value))
If dic.Exists(key) Then
Rows(i).Delete
Else
dic.Add key, True
End If
Next i
End Sub
🔍 複合条件として使われることが多い組み合わせ(実務例)
・商品コード × 日付
・社員ID × 勤務日
・顧客番号 × 購入日
・店舗コード × 商品コード
・伝票番号 × 行番号
・部門 × 商品名 × 区分
・請求番号 × 明細番号
どれも「1列では一意にならない」業務データです。
参考:【VBA】オートフィルターに複数条件を設定する方法|業務効率を劇的に上げるフィルター自動化
🟥 よくある誤判定と防止策
| 問題 | 原因 | 防止策 |
|---|---|---|
| "001" と "1" が一致してしまう | 数値化される | CStrで文字列化 |
| 日付の比較がおかしい | 文字列扱い | CDateで変換 |
| 空白が原因で判定ズレ | "A" と "A " が別扱い | Trim |
| "A|B" と "A|" & "B" が混同 | キー結合ミス | 区切り文字で統一 |
| 最終行の取得ミス | 空白行 | End(xlUp) |
🧩 実務で使える応用例:削除ではなく「重複抽出」する
重複を消すのではなく、別シートに重複行だけ抽出したい場合も多いです。
【サンプル】複数列の重複行を抽出する
If dic.Exists(key) Then
r = r + 1
Sheets("重複").Rows(r).Value = Rows(i).Value
Else
dic.Add key, i
End If
📌 複数条件の重複削除は“前処理”として最も重要
重複削除は、集計・分析・データ整形の前提となる処理です。
- ピボットテーブルが正しく計算されない
- RPAでエラー
- マスタ登録で重複
- 最新データの更新で誤集計
- CSV出力で不整合
すべて“重複データが原因”としてよく起こるトラブルです。
✅ まとめ:複数条件の重複削除はDictionaryが最強。大量データでは配列が必須。
最後に、この記事のポイントをまとめます。
- 複数条件の重複削除は「複合キー」で判定する
- RemoveDuplicatesは簡単だが実務では非推奨
- Dictionaryは高速で柔軟性が高く実務向け
- 配列×Dictionaryは大量データ処理で最速
- Trim / CStr / CDate などの前処理が重要
- 削除は必ず下から行う
- 初心者でも完全自動化できるテンプレートを紹介
- RPAやChatGPTと併用すると業務効率化が最大化
複数条件での重複削除を理解すれば、Excelデータ処理の品質と速度が大幅に向上し、実務でも“ミスゼロ”の高品質なデータ管理が実現できます。