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

【VBA】重複削除を複数条件で行う方法|複合キー(複数列)でデータを正確に整理する

Excel業務では、売上データ・顧客データ・勤怠データなどで「複数列による重複削除」が必要になるケースが非常に多くあります。例えば次のような場面です。

  • 商品コード × 日付 の組み合わせが同じ行を削除したい
  • 社員ID × 勤務日の重複を除去したい
  • 顧客番号 × 購入日が重複して登録されている
  • 店舗コード × 商品 の重複行だけまとめたい

Excelの「重複の削除」機能でも複数列を指定することはできますが、

  • 毎回手動で指定する必要がある
  • 毎回フィルタを解除する必要がある
  • シート構成が変わると操作ミスが起きやすい
  • 大量データだと非常に重くなる

という欠点があります。

このような問題を解決するのが VBAによる複数条件の重複削除 です。

VBAでは、複数列の値を組み合わせた「複合キー」を使うことで、
どんな複雑な条件でも高速かつ正確に重複を削除できます。

この記事では、複数条件での重複削除の考え方から、初心者向けのシンプルな方法、実務向けのDictionaryを使った高速処理、大量データ向けの配列処理まで 完全体系化した記事 を解説します。

目次

✅ 重複削除を複数条件で行うとは?複合キーで行レベルの一意性を管理する

・複数列の値を組み合わせて“1つのキー”として扱う

例えば A列「商品コード」、B列「日付」の場合:

A列B列
A0012024/01/01
A0012024/01/01
A0022024/01/05

これを1列として考えるのではなく、
A列 & "_" & B列 のように結合して1つのキーとして扱う
ことで、複数列が一致する行を重複として検出できます。


・なぜ複合キーが必要なのか?

実務データでは「1つの列が一意とは限らない」ためです。

例:

  • 商品コードだけでは重複あり
  • ただし “商品コード × 日付” なら一意
  • 社員IDだけでは重複あり
  • ただし “社員ID × 勤務日” なら一意

現場ではほぼ必ず複数条件で重複判定するケースがあります。


・VBAでは「組み合わせ=文字列化」し比較するのが基本

複数列を結合して1つの文字列にすることで、比較が簡単になり、
Dictionaryなど高速処理との相性も良くなります。


✅ 複数条件の重複削除で使う主なVBA手法(3種類)

  1. RemoveDuplicates を使う方法(最も簡単)
  2. Dictionary を使う方法(実務で最も多い)
  3. 配列を使った大量データ高速処理(上級)

この記事ではすべての方法を実務レベルで解説します。

参考:【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データ処理の品質と速度が大幅に向上し、実務でも“ミスゼロ”の高品質なデータ管理が実現できます。

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