こんにちは、Ryoです。
VBAを使ってExcel上のデータを処理する際に、場合によっては重複してしまうこともあるかと思います。その重複したデータをマニュアルで削除したり、改めて削除する為のコードを書くのも面倒ですからRemoveDuplicatesメソッドを使って指定範囲内の重複した値は削除してしまいましょう。今回はその内容について書いていきます。
1.サンプル概要
サンプルとしては至ってシンプルな表ですが、画像のように品番が重複しています。
この表に対し重複したデータを削除する処理を行えば、このようになります。
2.サンプルコード
Sub Sample1() Range(Cells(3, 2), Cells(16, 2)).RemoveDuplicates _ Columns:=Array(1), Header:=xlYes End Sub
コードとしてはこれだけなのですが、使うのはRemoveDuplicatesメソッドです。
指定範囲.RemoveDuplicates(Columns,Header)
引数のColumnsは重複する列をチェックするものですが、サンプルコードにあるようにArray関数を使用しています。これは指定した範囲の最初の1列目を指定するものです。
範囲の中で2列目まで指定したい場合はColumns:=Array(1,2)となります。
Range(Cells(3, 2), Cells(16, 3)).RemoveDuplicates _
Columns:=Array(1, 2), Header:=xlYes
このように変更して、先程のサンプルの表をC列にも増やして実行してみると、
指定した通り2列共に重複データを削除してくれます。
しかしながら使用上の注意点がありまして、上のサンプルはC列もB列と同じ内容なので問題ないのですが、列毎に内容が異なっている場合は正常に動作しないようです。
例えば以下画像のようにB列とC列でデータが異なっている場合で処理すると
以下のようになり、C列の重複データが残っています。
これはB列とC列の範囲を指定した中で処理を行うので結果に差異が生じる為だと思いますので、各列毎に処理する形にすれば回避できます。
Sub Sample2() For i = 2 To 3 Range(Cells(3, i), Cells(16, i)).RemoveDuplicates _ Columns:=Array(1), Header:=xlYes Next i End Sub
For~NextでB列、C列でそれぞれ処理を実行すると以下の通り正常に処理されます。
ちょっとColumnsの説明が長くなってしまいましたが、もう一つある引数Headerは表の1行目を「見出し」(処理しない)とするか、「データ」(処理対象)とするかを指定します。
ここは省略可能で規定値はxlNoになります。
また、もう一つの指定でxlguessというものがあって、Excelにヘッダーを判断させるものなのですがあまり使うことはないと思いますので、ご参考までに。
詳細はこちらのMSDNがわかりやすいと思います。
後もう一つ補足です!
本サンプルではColumnsで対象が1列でもArray関数を使用しています。他には単独の列を指定するColumns:=1として、重複をチェックする列を指定する方法もありますが、ここでいう列の指定とは「指定した範囲での列」なので、本サンプルの場合はB列から書いてあっても指定した範囲の1番目なので記述はColumns:=1となります。紛らわしいですね(笑)
Range(Cells(3, 2), Cells(16, 2)).RemoveDuplicates Columns:=1, Header:=xlYes
Sample1であれば、このような記述でもOKです。
3.まとめ
重複したデータを削除する形での処理は、私の場合はどちらかというと過去のデータを整理したりする際に使うことが多いですね。使用機会や頻度は限られると思いますが、このような手段もあることを知っておくと何かの役に立つこともあると思いますので、機会があればご検討くださいませ!
以上、重複するデータを削除する方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo