【ExcelVBA入門】重複データを削除する方法を徹底解説!

こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。

皆さんは、VBAで重複データを削除する方法を知っていますか?無駄なデータがあるとデータ分析結果がおかしくなるだけでなく、ファイル自体も重たくなってしまうため重複データは削除する方法を覚えておくのがおすすめです!

そこで今回は、

  • 重複データとは
  • VBAで重複データを削除する2つの方法
  • 重複データを高速に削除する方法

といった基礎的なことから、応用的な方法まで、徹底的に解説します!

目次

重複データとは

まず、重複データについて簡単に解説します。Excelで一覧形式のデータを作るとき、次のように同じデータとなっている箇所が重複データです。

No以外のデータが同じデータになっていますよね。なんらかの意図があって同じデータを作っているのであればそのままでもいいのですが、そうでない場合はデータ集計や分析時に困ってしまいますよね。このような場合、重複データを削除する方法を覚えておくと便利です。

VBAで重複データを削除する方法

次に、VBAで重複データを削除する方法について解説します。VBAで重複データを削除する方法は、大きく分けて2パターンあります。

  • 1. ループ処理で1つずつチェックして削除する
  • 2. RemoveDuplicatesメソッドを使って削除する

それぞれ解説しますね。

ループ処理で重複削除

まずは、ループ処理で重複削除する方法について解説します。

上から順にデータを見ていき、1つ上のデータと同じだった場合に行削除する方法です。言葉だけではわかりづらいので、1件目のデータ・2件目のデータの重複をチェックするデータイメージを用意しました。

1件目のチェックするデータイメージ:

2件目のチェックするデータイメージ:

上から順に2つのデータをチェックし、同じデータがあった場合のみ行を削除する流れで、データの行数分処理をループするイメージですね。具体的なイメージを持ってもらうために、サンプルコードを用意しました。

サンプル実行前のデータ:

ループ処理で重複削除するサンプルコード:

Sub Test()
  'データの最終行を取得
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  'データ行数分 重複削除
  Dim i As Long
  For i = 3 To maxRow
    '上の行と比較して、重複している場合のみ削除
    If Cells(i - 1, 2) = Cells(i, 2) Then
      Rows(i).Delete
    End If
  Next i
End Sub

サンプル実行後のデータ:

最初に、「Cells(Rows.Count, 1).End(xlUp).Row」でデータの最終行を取得し、For文でデータの3行目から最終行まで重複データ削除処理をループ処理しています。上の行「Cells(i – 1, 2)」と下の行「Cells(i, 2)」が同じだったときのみ、「Rows(i).Delete」で行削除しています。

このように、ループ処理で重複データを削除することができます。

RemoveDuplicatesメソッドで削除

次に、RemoveDuplicatesメソッドを使った重複削除方法について解説します。RemoveDuplicatesメソッドを使って次のように書くことで、簡単に重複削除することができます。

RemoveDuplicatesメソッドの使い方:

Range(セル範囲).RemoveDuplicates (Array(列番号1 , 列番号2 , … 列番号n))

Rangeでセル範囲を「A1:D5」や「B2:L4」のように範囲指定し、RemoveDuplicatesメソッドの引数に重複を確認する列番号を指定することで、重複データを削除できます。

具体的なイメージを持ってもらうために、サンプルコードを用意しました。

サンプル実行前のデータ:

サンプルコード:

Sub Test2()
  'データの最終行を取得
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  '重複しているデータを削除
  Range("A1:D" & maxRow).RemoveDuplicates (Array(2, 3, 4))
End Sub

サンプル実行後のデータ:

ループ処理のときと同じように「Cells(Rows.Count, 1).End(xlUp).Row」で最終行を取得し、「”A1:D” & maxRow」で最終行までのセル範囲を指定し、RemoveDuplicatesメソッドの「Array(2, 3, 4)」で「名前・得意言語・経験年数」の3つのデータで重複をチェックし、一致したデータを削除しています。

このように、RemoveDuplicatesメソッドを使えば、簡単に重複データを削除することができます。

高速に重複データを削除する方法

ここまで読んだ方は、

ループ処理とRemoveDuplicatesメソッドは、どちらを使えばいいんだろう?
と思っている方が多いのではないでしょうか。

結論から言うと、処理速度的にRemoveDuplicatesメソッドを使うのがおすすめです!速度を確認するために、先ほどのデータを1万行に増やして処理速度を確認してみました。

テスト用の1万件のデータ:

処理速度:

  • ループ処理結果 :11秒
  • RemoveDuplicates:1秒以内

圧倒的に、RemoveDuplicatesメソッドを使った方が処理が速いですよね。また、処理の行数で見てもRemoveDuplicatesメソッドの方が少なくシンプルなので、RemoveDuplicatesメソッドがおすすめです!

ちなみに、処理速度は以下のようにFormat関数を使って、計算しています。

処理時間計測方法:

Sub Test()

  '開始時間出力---
  Debug.Print "開始時刻:" & Format(Now(), "YYYY/MM/DD HH:MM:SS")
  
  'メイン処理---
  'データの最終行を取得
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  '重複しているデータを削除
  Range("A1:D" & maxRow).RemoveDuplicates (Array(2))


  '終了時間出力---
  Debug.Print "終了時刻:" & Format(Now(), "YYYY/MM/DD HH:MM:SS")

End Sub

実行結果例:

開始時刻:2018/10/04 13:13:32
終了時刻:2018/10/04 13:13:32

「Format(Now(), “YYYY/MM/DD HH:MM:SS”)」で現在の日付・時刻を確認できるので、それを使って開始時刻・終了時刻を出力して確認しています。処理時間の計測方法を覚えておけば、重たい処理に対処しやすくなるので覚えておくと便利です!

まとめ

今回は、VBAで重複データを削除する方法について解説しました。重複データがあるとデータ分析結果が正しく出ないだけでなく、無駄なデータでファイルが重たくなってしまいます。

RemoveDuplicatesメソッドを使えば簡単に速く重複削除できるので、ぜひ使ってみてくださいね!

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次