こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、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メソッドを使うのがおすすめです!速度を確認するために、先ほどのデータを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メソッドを使えば簡単に速く重複削除できるので、ぜひ使ってみてくださいね!