Excelにデータを入力する際、同じ内容が複数回登録されてしまう「重複」はよくある問題です。メールアドレスや会社名が重複して登録されると、データの正確性や実用性が落ちます。目視でのチェックは時間がかかり見落としも発生しやすいため、マクロで自動化するのが効果的です。
この記事では、重複データを自動検出してハイライト表示するマクロを解説します。
重複データを自動でハイライト表示するには?
A列にメールアドレスなどのデータが入っている場合、重複している行だけを黄色に塗るマクロです。
Sub HighlightDuplicates()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cellValue As String
Dim checkRange As Range
Set ws = ThisWorkbook.Sheets("データ")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Set checkRange = ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, 1))
' 既存のハイライトを先に削除
checkRange.Interior.ColorIndex = xlNone
' 重複検出
For i = 2 To lastRow
cellValue = ws.Cells(i, 1).Value
If WorksheetFunction.CountIf(checkRange, cellValue) > 1 Then
ws.Cells(i, 1).Interior.Color = RGB(255, 255, 0) ' 黄色
End If
Next i
MsgBox "重複データに色を付けました"
End Sub
コードのポイントを理解するには?
checkRange.Interior.ColorIndex = xlNone
まず既存のハイライトをすべてクリアします。マクロを複数回実行しても前回の色が残らないようにするための処理です。
WorksheetFunction.CountIf(checkRange, cellValue) > 1CountIf でチェック範囲内に同じ値が2件以上あるかどうかを判定します。2件以上あれば重複と判断して黄色に塗ります。
Interior.Color = RGB(255, 255, 0)
セルの背景色を黄色(RGB値:赤255・緑255・青0)に設定します。色は RGB() の値を変えることで自由に変更できます。
重複データを削除するには?
ハイライトで確認した後、重複行を自動削除したい場合は次のコードを使います。後ろの行から削除する点がポイントです(前から削除すると行番号がずれて正しく動作しません)。
Sub DeleteDuplicates()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cellValue As String
Dim checkRange As Range
Set ws = ThisWorkbook.Sheets("データ")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 後ろから削除することで行番号のズレを防ぐ
For i = lastRow To 2 Step -1
cellValue = ws.Cells(i, 1).Value
Set checkRange = ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, 1))
If WorksheetFunction.CountIf(checkRange, cellValue) > 1 Then
ws.Rows(i).Delete
lastRow = lastRow - 1
End If
Next i
MsgBox "重複行を削除しました"
End Sub
まとめ
CountIfを使って同じ値が2件以上あるかどうかで重複を判定する- 実行前に
Interior.ColorIndex = xlNoneで既存のハイライトをクリアする Interior.Color = RGB(255, 255, 0)で重複セルを黄色にハイライトする- 重複行を削除する場合は後ろの行から処理する(行番号のズレを防ぐため)
- まずハイライトで確認し、問題なければ削除という2段階の運用が安全
よくある質問
A列以外の列で重複チェックしたい場合はどうすればいいですか?
コード内の列番号(Cells(i, 1) の 1)を変更するだけで対応できます。例えばB列なら Cells(i, 2)、C列なら Cells(i, 3) に書き換えてください。
ハイライトの色を黄色以外に変えられますか?
変えられます。RGB(255, 255, 0) の数値を変えることで色を自由に指定できます。例えば赤なら RGB(255, 0, 0)、オレンジなら RGB(255, 165, 0) です。
大文字・小文字の違いは重複として判定されますか?
デフォルトでは大文字・小文字を区別せず同一として判定されます。区別したい場合は CountIf の代わりにループと StrComp 関数で比較する方法に変更する必要があります。
重複を削除する際に最初の1件だけ残すことはできますか?
できます。後ろから削除するコードでは、先に出現した行(上の行)を残して後から出現した行(下の行)を削除する動きになります。先頭行を残したい場合はそのままで問題ありません。
マクロを実行する前に確認ダイアログを出すことはできますか?
できます。MsgBox "重複行を削除しますか?", vbYesNo で確認ダイアログを出し、「はい」のときだけ処理を進めるように分岐を追加すると安全性が上がります。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



