プチIT化 PR

【VBA】removeduplicates、複数列の情報で重複削除するには?

記事内に商品プロモーションを含む場合があります。
当サイトは、アフィリエイト広告を利用しています。

こんばんは!今回の記事は、ExcelのVBAマクロで重複を削除する判定に複数列の情報を指定するにはどうしたら良いか?という記事です。

気になる人
気になる人
重複判定のキー、複数列で指定したいな!

1列だけでなく2列(または3列、それ以上や飛び飛びの列で)をキーに、重複判定を複数列で指定する方法をまとめてみました。重複削除が思い通りに動かせない人の参考になれば幸いです。それでは、いってみましょう!

removeduplicatesの基本の使い方

removeduplicatesの基本の使い方は以下です。

'重複行を削除
Worksheets("Sheet1").Range("範囲").RemoveDuplicates Columns:=Array(列), Header:=ヘッダー設定
Range対象範囲を指定。
「A1:C3」や列ごと「A:C」などと指定。
Columnsどの列をキーにしてデータで重複確認するかを列番号で指定。
「1」や「2」、複数列の場合「1,2」などと指定する。
Headerどの列をキーにしてデータで重複確認するかを指定。
xlNo:見出しなし(指定しない場合はデフォルトでこれ)
xlYes:見出しあり
xlGuess:見出しの有り無しを自動で判定
良く分かっていない人
良く分かっていない人
具体的な例でみていきましょう!

具体的な例でみるremoveduplicates

単列で重複判定する場合

Sheet1のA列からB列の範囲で、1列目(=A列)を重複判定に使うというマクロサンプルです。

'重複行を削除
Worksheets("Sheet1").Range("A:B").RemoveDuplicates Columns:=Array(1), Header:=xlYes

以下のサンプルデータで実行してみます。

指定した範囲(A列からB列)の1列目(=ここで言うA列)の日付をキーに重複を確認しています。なので、日付が被ったら、その行は削除されるという動きになっています。

日付だけ見ているので、商品名が異なったとしても日付が同じであれば削除されてしまっています。ちなみに、動きとしては、一番上の行が残るようです。

複数列で重複判定する場合(2列)

日付と商品名どちらもキーにして重複を判定したいという事もありますよね。Sheet1のA列からB列の範囲で、1列目(=A列)と2列目(=B列)の2列の複数列で重複判定したいときのサンプルマクロです。ColumnのArrayの中をカンマ区切りで列指定します。

'重複行を削除
Worksheets("Sheet1").Range("A:B").RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes

サンプルデータで実行してみてみましょう。

Array(1,2)と範囲の1列目と2列目(例で言うA列とB列)を重複のキーとしたことで、日付と商品名の組み合わせが一致した時にのみ重複と判定してその行は削除される動きとなっています。

複数列で重複判定する場合(3列)

2列だけでなく、もっと多くの列を重複判定のキーの対象にしたいこともありますよね。そういう場合、まずは3列から紹介します。

Sheet1のA列からC列の範囲で、1列目(=A列)と2列目(=B列)と3列(=C列)の3列の複数列で重複判定したいとき。ColumnのArrayの中をカンマ区切りでArray(1,2,3)と列指定します。

'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes

サンプルデータで実行してみます。先ほどのデータに値段を追加してみました。日付・商品・値段の全てが重複しないと削除しないことになります。

件数が多いので、7行目と8行目の日付・商品・値段を重複させてみました。3列がキーとなっているので、完全に3列のデータが被ったデータだけ削除されていることが分かりますよね。

離れたとびとびの複数列で重複判定する場合(1列と3列)

前章から続いていますが、3列すべてをキーにするのではなく、その中で飛び飛びの1列目と3列目(つまりは日付と値段)だけを重複判定のキーにしたい場合もあるかもしれません。

その場合、Array(1,3)ととにかくキーにしたい列番号を指定すればOKです。

'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 3), Header:=xlYes

先ほどのサンプルデータで実行してみます。日付と値段が重複したものが削除され、商品の名前は重複しているかどうか見られません。

これも一番上の行が代表行として残るようです。

重複判定の対象列が増える時(3列以上)

3列以上、4列、5列、6列…と判定対象となる列の指定を増やしたい時もありますよね。これまでの流れと同じように、Arrayをカンマ区切りで列指定すれば良いです。

1~5列を重複判定の列として指定したい場合のサンプル。

'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5), Header:=xlYes

1,3,6列を重複判定の列として指定したい場合のサンプル。

'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 3, 6), Header:=xlYes

Arrayの中の指定を変えればいいので簡単ですよね!

おまけ!エラーが出た場合:実行時エラー'5'

今回、いろいろ試している中で、以下のエラーに出会いました。

実行時エラー'5'
プロシージャ―の呼び出し、または引数が不正です。

これは、Range範囲を超えてColumn列を指定した場合に出るエラーでした。

例えば、以下のように範囲がA~C列の3列分しかないにも関わらず、重複判定のキーがArray(1, 3, 6)と1列目・3列目・6列目と指定されていて、6列目ってそもそも範囲外じゃん!というエラーでした。

'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 3, 6), Header:=xlYes

さいごに

いかがだったっでしょうか。重複業の削除、複数列で重複判定したい場合にどうしたらいいの?という同じような疑問を持たれた方の参考になれば幸いです。少しでもイメージが伝われば良いな、と思います。それでは、また!