Excelでデータを整理するうえで「重複を削除する」作業は非常に頻繁に行われますが、単一の列ではなく複数列を条件にして重複を削除したいという場面も多いのではないでしょうか。
たとえば以下のような状況です:
氏名だけでなく、生年月日も一致する場合のみ重複とみなしたい
部署と社員番号の両方が一致している行を削除対象にしたい
商品コードと仕入先のペアが重複している場合のみ1件を残したい
こうしたケースでは、複数の列を組み合わせて1つの「重複判定キー」として扱う必要があります。
本記事では、Excelにおける「複数列を条件にした重複削除」の具体的な方法を、標準機能・関数・Power Query・VBAという観点から詳しく解説していきます。
目次
Excelの「重複の削除」機能で複数列を条件に指定する
Excelの標準機能である「重複の削除」では、複数の列を同時に選んで重複条件に指定することができます。
操作手順:
重複削除をしたいデータ範囲(例:A1:C100)を選択
「データ」タブ →「重複の削除」
「重複の基準」となる列を複数選択(例:氏名・生年月日)
「OK」を押すと、選択した複数列の値がすべて一致する行だけが重複とみなされ、1件だけ残して削除されます
例:
| 氏名 | 生年月日 | 部署 |
|---|---|---|
| 山田 | 1990/01/01 | 総務部 |
| 山田 | 1990/01/01 | 経理部 |
| 山田 | 1990/01/01 | 総務部 |
→ 「氏名」と「生年月日」で重複削除すると、部署が違う2行は別扱いになります
→ 「氏名+生年月日+部署」の3列をすべて指定して削除すれば、完全一致行のみ削除対象となります
ポイント:
削除されるのは2行目以降の重複行
最初の出現行が残る
元のデータが上書きされるのでバックアップ必須
【Excel】重複削除を正しく行う方法|関数・フィルター・Power Queryを使いこなす実践ガイド
✅ COUNTIFS関数で複数列の重複を判定する方法
Excelの関数を使えば、複数の列を条件にして「重複しているかどうか」を判断することができます。
例:氏名(A列)+生年月日(B列)を条件にする
=COUNTIFS($A$2:$A$100, A2, $B$2:$B$100, B2) > 1
→ この式は、「A列とB列の値が同じ行が2件以上ある場合」に TRUE を返します。
・一意な行だけを抽出方法
上記の式で
FALSE(=出現回数1回)となる行のみをフィルター別シートにコピーすることで、重複を含まない一意なデータだけを抽出可能
メリット:
重複判定条件を自由に設定できる
実際に削除する前に「確認」がしやすい
条件付き書式にも応用可能(重複に色をつけるなど)
【Excel】削除せずに最新データだけを別シートへ出力する方法|関数・Power Query・VBAによる自動抽出テクニック
✅ Power Queryで複数列をキーにした重複削除を行う方法
Power Queryでは、「複数列を選択した状態で重複を削除する」ことが可能であり、自動化や更新に強いのが特長です。
操作手順:
対象のデータを選択 →「データ」タブ →「テーブルまたは範囲から」
Power Queryエディタが起動したら、Ctrlを押しながら複数列を選択(例:氏名・生年月日)
「ホーム」タブ →「行の削除」→「重複の削除」
「閉じて読み込む」で別シートに出力
特徴:
選択した複数列すべてが一致する行だけを削除対象にできる
元のデータは保持される
データを追加しても「更新」ボタンで再処理可能
複数列を条件にした重複削除は、精度の高いデータ整理を行ううえで非常に重要な方法です。
「1つだけ残す」「最新データを残す」「行単位で削除する」など、条件別の削除方法をまとめて確認したい場合は、次の総合ガイドもあわせて参考にしてください。
✅ VBAで複数列をキーにして重複を削除するマクロ
自動化や大量データを扱う場合は、VBAを使って複数列をキーとする重複削除を効率的に行うことが可能です。
サンプルコード:
Sub 複数列で重複削除()
Dim dict As Object
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim key As String
Set ws = ActiveSheet
Set dict = CreateObject("Scripting.Dictionary")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
' ここで複数列のキーを連結
key = ws.Cells(i, 1).Value & "|" & ws.Cells(i, 2).Value
If dict.exists(key) Then
ws.Rows(i).Delete
Else
dict.Add key, 1
End If
Next i
MsgBox "複数列の重複を削除しました。"
End Sub
ポイント:
keyに複数列の値を連結して、1つの文字列として辞書で管理|などの記号を区切りにしておくと、誤認識が防げる最初の出現行だけが残る(下から削除しているため安全)
・注意点とトラブル回避
| 問題 | 原因 | 解決策 |
|---|---|---|
| 重複が正しく削除されない | 空白や全角/半角、日付の文字列化など | TRIM, CLEAN, TEXT関数などで前処理を行う |
| 条件が一部しか一致していないのに削除される | 列の選択ミス、または基準列が正しくない | 削除対象となる列を正しく指定してから操作する |
| 元データが破壊されてしまった | 削除前のバックアップがない | 操作前に「コピーシート」を作成するのが安全 |
| 数式コピー時に参照がずれてしまう | 絶対参照と相対参照が混在している | $A$2:$A$100 のように絶対参照で範囲指定を統一する |
・まとめ:複数列での重複削除を活用して、より精度の高いデータ管理を実現しよう
Excelでのデータ整理や管理業務において、「重複削除」は基本かつ重要な作業ですが、複数列を条件にした重複削除を使いこなせると、より高精度で柔軟なデータ整備が可能になります。
| 方法 | 特徴 |
|---|---|
| 重複の削除(標準機能) | 手軽で早いが、元データが破壊されるため注意が必要 |
| COUNTIFS+フィルター | 条件の自由度が高く、削除前の確認や色付けなどにも応用できる |
| Power Query | 自動処理に強く、複数列選択が直感的で更新にも対応できる |
| VBAマクロ | 完全自動化に適し、複雑な条件にも柔軟に対応可能 |