Excelでデータ整理をしていると、次のような悩みはありませんか?
- 同じデータが何度も入っていて見づらい
- 手作業で重複を消すのが面倒
- 毎回「データ」→「重複の削除」を押すのが手間
そんなときに便利なのが、ExcelVBAで重複データを自動削除するマクロです。
ワンクリックで重複を整理できるので、日々のデータ処理がかなり楽になります。
この記事では、初心者でもそのまま使えるように、A列の重複を削除する基本コードから、複数列対応・見出しあり対応・よくあるエラー対策までまとめて解説します。
この記事でできること
- A列の重複データを一発で削除する
- 見出しあり / 見出しなしの違いが分かる
- 複数列をキーにして重複削除する
- 実務でそのまま使える形に応用できる
まずは基本:A列の重複データを削除するコード
まずは一番シンプルな形です。
A列の値が重複していたら、最初の1件だけ残して削除します。
Option Explicit
Sub DeleteDuplicateRows()
Dim lastRow As Long
Dim rng As Range
' A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 重複削除対象の範囲を設定(A1~A列の最終行)
Set rng = Range("A1:A" & lastRow)
' 重複を削除(最初の値は残る)
rng.RemoveDuplicates Columns:=1, Header:=xlNo
MsgBox "重複データを削除しました。", vbInformation
End Sub
このコードでやっていること
① 最終行を取得する
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
A列の一番下から上に向かって、データが入っている最後の行を探しています。
これにより、データ件数が毎回変わっても自動で対応できます。
② 重複削除する範囲を決める
Set rng = Range("A1:A" & lastRow)
A1から最終行までを対象にしています。
今回はA列だけを基準に重複判定するため、この範囲指定にしています。
③ RemoveDuplicates で削除する
rng.RemoveDuplicates Columns:=1, Header:=xlNo
この1行で重複削除ができます。Columns:=1 は「範囲内の1列目を基準にする」という意味です。Header:=xlNo は「見出しなし」です。
見出しがある場合の書き方
1行目が見出しの場合は、Header:=xlYes に変更します。
Option Explicit
Sub DeleteDuplicateRows_Header()
Dim lastRow As Long
Dim rng As Range
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range("A1:A" & lastRow)
rng.RemoveDuplicates Columns:=1, Header:=xlYes
MsgBox "重複データを削除しました。", vbInformation
End Sub
見出しがあるのに xlNo のままだと、見出しもデータとして扱われるので注意してください。
複数列を基準に重複削除する方法
実務では「A列だけ」ではなく、複数列の組み合わせが重複しているかで判定したいことも多いです。
例えば「社員番号+日付」や「商品コード+店舗名」などです。
Option Explicit
Sub DeleteDuplicateRows_MultiColumns()
Dim lastRow As Long
Dim rng As Range
' A列を基準に最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' A列~C列を対象にする
Set rng = Range("A1:C" & lastRow)
' A列とB列の組み合わせで重複削除
rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
MsgBox "複数列を基準に重複データを削除しました。", vbInformation
End Sub
この場合、A列とB列の組み合わせが同じ行を「重複」とみなします。
行全体を残したまま重複削除したい場合
よくある勘違いとして、A列だけを対象にすると「A列だけが削除される」と思われがちですが、
実際には 該当行全体の重複データが整理される使い方をすることが多いです。
例えば、A列をキーにしつつ A~D列を対象にしたい場合は、範囲を広く取ります。
Option Explicit
Sub DeleteDuplicateRows_FullRow()
Dim lastRow As Long
Dim rng As Range
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' A列~D列を対象範囲にする
Set rng = Range("A1:D" & lastRow)
' A列を基準に重複削除
rng.RemoveDuplicates Columns:=1, Header:=xlYes
MsgBox "A列を基準に行全体の重複を削除しました。", vbInformation
End Sub
実行手順(初心者向け)
- Excelファイルを開く
- Alt + F11 でVBAエディタを開く
- 「挿入」→「標準モジュール」をクリック
- コードを貼り付ける
- F5 キーで実行する
実務でよくある活用例
- 会員リストの重複整理
- 売上データの重複除去
- CSV取込後のデータ整形
- 日報・ログ一覧の整理
特に、毎日データを貼り付ける業務では、最初にこのマクロを通すだけでかなり効率が上がります。
よくあるエラーと対処法
① 最終行がうまく取れない
A列に途中空白が多い場合は、最終行取得の基準列を変えたほうが安定することがあります。
例えばB列を基準にするなら、次のようにします。
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
② 見出しが消えてしまう
1行目が見出しなのに Header:=xlNo になっている可能性があります。
見出しがある場合は Header:=xlYes にしてください。
③ コードは正しいのにエラーになる
ブログやWebサイトからコードをコピーした場合、見えない特殊文字や全角記号が混ざることがあります。
その場合は、エラーが出ている行を一度削除して、手入力または再コピペすると直ることがあります。
特に壊れやすいのは次の部分です。
"(ダブルクォーテーション)=(イコール)Array(1, 2)のカンマやカッコ
さらに安全に使うならバックアップ推奨
RemoveDuplicates は便利ですが、削除したデータは元に戻しにくいことがあります。
大事なデータで使う場合は、事前にファイルをコピーしておくのがおすすめです。
まとめ
- 重複削除は
RemoveDuplicatesで一発 - A列だけでも、複数列でも対応できる
- 見出しの有無で
Header:=xlYes / xlNoを使い分ける - 実務では「行全体を対象」にすると使いやすい
重複データの削除は、Excel作業で非常によく使う処理です。
このマクロを1つ持っておくだけで、データ整理の時間をかなり短縮できます。
ぜひ、実務のExcelでも活用してみてください。


コメント