【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メソッドを使えば簡単に速く重複削除できるので、ぜひ使ってみてくださいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説