Excel VBAで重複を削除する方法をお探しですね。

広告

Excelで重複データを削除したい!VBAのRemoveDuplicatesメソッドを使いこなそう

Excelで名簿や商品リスト、取引データなんかを管理していると、気づいたら同じデータが何個も入っちゃってること、ありますよね。

そのせいで集計結果がおかしくなったり、プルダウンのリストがごちゃごちゃして見づらくなったり…。

手作業で「データ」タブから「重複の削除」を実行してもいいんですけど、毎回同じ作業をするならVBAで自動化しちゃった方が断然ラクです。

この記事では、Excel VBAでリストから重複データを一気に削除する方法として、RemoveDuplicatesメソッドの使い方を、基本から応用まで分かりやすく解説していきます。

重複データの削除にはRemoveDuplicatesが便利!

Excel VBAで重複データを削除する方法っていくつかあるんですが、一番シンプルで実用的なのがRemoveDuplicatesメソッドです。

これは、Excelの「重複の削除」機能をVBAから呼び出せるメソッドで、指定した範囲の中から重複している行をまとめて削除できます。

For文で1行ずつ比較しながら削除していく方法もあるにはあるんですが、データが多くなるほど処理が重くなりやすいし、コードもけっこう複雑になっちゃいます。

その点、RemoveDuplicatesなら1行のコードでサクッと実行できて、Excel側の機能を使うから処理も速いんです。

基本的な書き方は、対象の範囲に対して「RemoveDuplicates」を続けて、どの列を重複判定に使うかを「Columns」で指定します。

たとえばA列に氏名リストがあって、1行目が見出しになっている場合は、こんな感じで書きます。

“`vba
Sub DeleteDuplicateNames()
Range(“A:A”).RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
“`

このコードは、A列全体を対象にして、A列の値が重複している行を削除します。

「Header:=xlYes」っていうのは「先頭行を見出しとして扱ってね」という意味です。

見出し行まで削除されちゃうと困るので、必ず指定しておくと安心ですよ。

Headerを省略すると意図しない結果になることもあるので、特に初心者の方は明示的に書いておくのがおすすめです。

RemoveDuplicatesを使うときに気をつけたいのが、「Columnsに指定する列番号は、ワークシート全体の列番号じゃなくて、指定したRange内で何列目か」を表すってこと。

たとえばRange(“B:D”)を対象にした場合、B列はColumns:=1、C列はColumns:=2、D列はColumns:=3として扱われます。

ここを勘違いすると、思ってた列じゃなくて別の列で判定されちゃうので注意してくださいね。

RemoveDuplicatesの基本構文と1列リストの重複削除

RemoveDuplicatesの基本構文は、こんな形で覚えておくと分かりやすいです。

対象範囲、重複を判定する列、見出しの有無を指定するだけなので、VBAに慣れてない人でも使いやすいと思います。

“`vba
Range(“対象範囲”).RemoveDuplicates Columns:=列番号, Header:=見出し指定
“`

たとえば、A1からA列の最終行までに商品名のリストがあって、重複している商品名を削除したいときは、最終行を取得してから範囲を指定すると実務でも使いやすくなります。

A列全体を指定しても動くんですが、データ量や周りの表の構造によっては、必要な範囲だけを明示した方が安全です。

“`vba
Sub DeleteDuplicatesInA()
Dim lastRow As Long

lastRow = Cells(Rows.Count, “A”).End(xlUp).Row
Range(“A1:A” & lastRow).RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
“`

このコードでは、A列の最終行を取得して、A1から最終行までを対象に重複削除を実行しています。

「Cells(Rows.Count, “A”).End(xlUp).Row」は、A列の一番下から上に向かって見て、最後にデータが入っている行番号を取得する定番の書き方です。

途中に空白行があっても最終データ行を取得しやすいので、業務用マクロでもよく使われています。

ちなみに、RemoveDuplicatesで削除されるのは「重複している後の方の行」です。

最初に出てきたデータは残って、2回目以降に出てきた同じデータが削除されます。

たとえば「東京」「大阪」「東京」っていう並びなら、最初の「東京」は残って、後ろの「東京」が削除されるイメージです。

どのデータを残したいかが重要な場合は、事前に並べ替えをして、残したい行が先に来るようにしてから実行するといいですよ。

複数の列を条件にして重複行を削除する方法

実際の仕事では、1列だけで重複を判断できないケースも多いですよね。

たとえば氏名だけで判定すると同姓同名の別人まで削除しちゃう可能性がありますが、「氏名」と「電話番号」とか「商品コード」と「日付」みたいに、複数の列を組み合わせればもっと正確に重複を判定できます。

RemoveDuplicatesでは、ColumnsにArrayを指定することで、複数列を条件にした重複削除ができるんです。

たとえばA列にNo、B列に氏名、C列に都道府県がある表で、B列とC列が両方一致する行を重複として削除したいときは、こんな風に書きます。

“`vba
Sub DeleteDuplicatesByNameAndPref()
Dim lastRow As Long

lastRow = Cells(Rows.Count, “A”).End(xlUp).Row
Range(“A1:C” & lastRow).RemoveDuplicates Columns:=Array(2, 3), Header:=xlYes
End Sub
“`

この例では、対象範囲はA列からC列までですが、重複判定に使うのは範囲内の2列目と3列目です。

つまり、B列の氏名とC列の都道府県が両方一致した場合に、重複行として削除されます。

A列のNoが違っていても、B列とC列が同じなら削除対象になるので、管理番号を無視して実質的な重複だけを消したいときに便利です。

逆に、A列からC列まで全部の列が完全一致した行だけを削除したいときは、「Columns:=Array(1, 2, 3)」って指定します。

この場合、No、氏名、都道府県のすべてが同じ行だけが重複と判断されます。

どの列を条件にするかで削除結果が大きく変わってくるので、実行する前に「何をもって重複とするのか」をはっきり決めておくことが大切です。

“`vba
Sub DeleteDuplicatesAllColumns()
Dim lastRow As Long

lastRow = Cells(Rows.Count, “A”).End(xlUp).Row
Range(“A1:C” & lastRow).RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
End Sub
“`

複数列を指定するときも、列番号はRange内での相対的な位置です。

「Range(“B:D”)」を指定して「Columns:=Array(1, 3)」って書いた場合、判定対象はB列とD列になります。

ワークシート全体のA列を1、B列を2って数えるんじゃなくて、指定範囲の左端を1列目として数える点を忘れないようにしましょう。

実務で安全に使うためのコツと応用コード

RemoveDuplicatesは便利で速いんですが、実行すると対象範囲の行が直接削除されちゃいます。

元データを戻したいと思っても、保存した後だと簡単には復元できないこともあるので、大事なデータに対してはバックアップを取っておくとか、別シートにコピーしてから処理するとか、処理前に確認メッセージを表示するとか、そういう工夫が必要です。

特に、顧客リストや売上データみたいに削除ミスが大問題になる表では、元データを直接いじらない設計にしておくと安心ですよ。

元データを残したまま重複なしリストを作りたいときは、作業用シートにコピーしてからRemoveDuplicatesを実行する方法が便利です。

たとえば、今のシートのA列リストを別シートにコピーして、そのコピー先で重複削除を行えば、元の一覧を保ったままユニークなリストが作れます。

プルダウン用の候補リストとか集計用のマスタを作るときには、この考え方がよく使われています。

“`vba
Sub CreateUniqueListOnNewSheet()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim lastRow As Long

Set wsSrc = ActiveSheet
Set wsDst = Worksheets.Add

lastRow = wsSrc.Cells(wsSrc.Rows.Count, “A”).End(xlUp).Row
wsSrc.Range(“A1:A” & lastRow).Copy Destination:=wsDst.Range(“A1”)

wsDst.Range(“A1:A” & lastRow).RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
“`

このコードでは、今開いてるシートを元データとして、新しいシートにA列をコピーしてから重複削除しています。

元シートのデータは変更されないので、処理結果を確認しながら作業できますよ。

必要に応じて、作ったシートの名前を「重複なしリスト」みたいに変更すると、後から見ても分かりやすくなります。

あと、重複削除の前にはデータの表記ゆれにも注意が必要です。

RemoveDuplicatesは基本的にセルの値をもとに重複を判定するんですが、「東京」と「東京都」、「ABC」と「ABC」、末尾に半角スペースが入った「佐藤 」みたいなのは、見た目が似てても別データとして扱われちゃうことがあります。

正確に重複削除したいなら、事前に余分な空白を削除したり、全角・半角を統一したり、表記ルールを整えてから実行すると精度が上がります。

“`vba
Sub TrimThenDeleteDuplicates()
Dim lastRow As Long
Dim i As Long

lastRow = Cells(Rows.Count, “A”).End(xlUp).Row

For i = 2 To lastRow
Cells(i, “A”).Value = Trim(Cells(i, “A”).Value)
Next i

Range(“A1:A” & lastRow).RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
“`

この例では、A列の各値に対してTrim関数を使って、前後の余分な半角スペースを取り除いてから重複削除しています。

ただし、Trimだけだと全角スペースまでは完全に処理できない場合があるので、日本語データを扱うときはReplace関数で全角スペースを削除するとか、データの性質に合わせた前処理も考えてみるといいですよ。

Excel VBAでリストから重複データを一括削除するなら、まずRemoveDuplicatesを使う方法を覚えるのが近道です。

1列の単純なリストにも、複数列を条件にした表データにも対応できて、For文で比較する方法よりコードが短くて、処理速度も期待できます。

ただし、削除対象の範囲、Columnsの列番号、Headerの指定、表記ゆれの有無を間違えると、思ってもみなかったデータが残ったり消えたりする可能性があります。

実務では、元データを守りながら、必要な列を正しく指定して使うことが大切ですよ。

広告