みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
あってはならないのですが、エクセルの表で間違えて同じデータを入力してしまっている場合、皆さんはどのように対処をされますか?
例えばそのデータが請求書のデータだったら、本来は一通で良い請求書が先方に二通届いてしまうかも知れません。
また、そのデータがテストの点数だったら、とある人のテストの点数が異様に高くなってしまうかも知れません。
…といったように、誤入力によるデータの重複を見逃すと、ひどい目に合うことがあります。
このデータの重複を対処する方法なのですが、まさか目で追って重複を確認するなどはやっていませんよね…?
そんなことをしていたら日が暮れちゃいますし、見逃しが発生します。
こういった作業はコンピュータが得意ですので、任せてしまいましょう!
今回はエクセルの超便利機能である重複削除の方法と、それをVBAのプログラムで実行する方法についてお伝えします。
エクセルでデータの重複削除をする
まずこのようなエクセルの表があるとします。
よく見るとわかるのですが、重複データがいくつか紛れ込んでいます。
こんな少ししかデータがなくても見逃しちゃいそうですからね…人の目なんぞは全く信用できるものではありませんね。
さて、ではこの表に重複の削除の機能を使用してみましょう。
全ての列が重複しているデータの重複の削除
まずセルを対象となる表のどこかに置きます。その上で、リボンから「データ」→「重複の削除」です。
するとエクセル、超頭が良いことに「たぶんここ」という範囲を勝手に選択してくれます。そして「重複の削除」ウィンドウが開きます。
このウィンドウでは
- 先頭行をデータの見出しとして使用するかどうかのチェックボックス
- 列をそれぞれ選択するチェックボックス
があります。
今回の場合は、先頭行は見出しなので「先頭行をデータの見出しとして使用する」にはチェックを入れたまま、また、全ての列が重複している場合に削除としたいので列の選択は全てチェックにしたままで「OK」とします。
すると
「重複する3個の値が見つかり、削除されました。一意の値が8個残っています。」とのこと。うまくいきましたね。
特定の列のみが重複しているデータの重複の削除
では列それぞれの選択のチェックボックスを外してみるとどうなるでしょうか?
先ほどの表に対しての重複の削除をする際に、「科目」と「点数」のチェックを外して「OK」としてみます。
すると
「重複する8個の値が見つかり、削除されました。一意の値が3個残っています。」とのことです。
「名前」の列だけにチェックが入っていましたから、この列だけを見て「一意」になるようにデータが削除されたわけです。
どの行が削除されずに残るかというと
- 最初に登場した「高橋」の行
- 最初に登場した「鈴木」の行
- 最初に登場した「山田」の行
が残ります。行数が最も少ない一意のデータが残るということですね。
エクセルVBAで重複の削除をする
では次にエクセルVBAで重複の削除をする方法をお伝えします。
エクセルVBAで重複の削除をする場合は、Rangeオブジェクトに対してのRemoveDuplicatesメソッドを使います。
Rangeオブジェクト.RemoveDuplicates Columns:=列番号の配列,
Header:=1行目を見出しとして使用するかの指定
列番号の配列ですが、どの列を見て重複の削除をするかを指定します。
Columns:=Array(列番号1,列番号2,…)
と、複数の列番号について指定します。
要は、ここで列番号を指定するということは、重複の削除のウィンドウでのそれぞれの列にチェックを入れたのと同じ意味になります。
また、Headerで指定する値ですが
- xlNo:1行目を見出しとして指定しない(既定値)
- xlYes:1行目を見出しとして指定する
- xlGuess:エクセルに判断を任せる
となります。既定値はxlNoなので、Header:=…を省略すると、1行目は見出しとして取り扱われません。
ちょっと気になるところですが、xlGuessを使うケースってあるんですかね…。
全ての列が重複しているデータの重複の削除をするVBA
では、プログラムを作ってみましょう。
まず全ての列を選択するパターン、つまり全ての列が重複している場合のみ重複の削除をするVBAプログラムはこちらです。
Sub duplicateDelete() Worksheets(1).Range("A:C").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes End Sub
ArrayにはA列からC列までの列番号1~3を全て列挙します。1行目は見出しですので、Headerの値はxlYesです。
簡単ですね。
ではこれを実行してみましょう。
瞬きをしている間に終わります。メッセージも何にも出ませんが、無事に完了しています。
ちなみにですがVBAで重複の削除をした場合は、アンドゥつまり Ctrl + Z などで一手前に戻すことができませんので、注意してくださいね。
特定の列のみが重複しているデータの重複の削除をするVBA
では、同様に「名前」の列だけを見て重複の削除をするVBAプログラムを作ってみましょう。
Sub duplicateDelete() Worksheets(1).Range("A:C").RemoveDuplicates Columns:=Array(2), Header:=xlYes '重複削除 End Sub
列の指定だけ変更をすれば良いですね。
実行結果はこちらです。
バッチリです。
まとめ
エクセルで絶対に覚えたほうが良い便利機能である重複の削除の方法 と、VBAで重複の削除をする方法についてお伝えしました。
目で見たり、オートフィルタをかけたりして作業をしてはダメですよ。重複の削除の機能を使えば、2クリックで正確に完了します。
VBAのプログラム内でも少しメソッド名は長いですが、たったの1行で実現できますから、ぜひ覚えて頂ければと思います。
コメント
お世話さまでございます。
“VBAで重複データを削除する” は大変参考になりました。
ありがとうございます。
エクセルの操作と対比しながらの説明は、とても理解し易いです。
今後ともよろしくお願いします。
Hiroshi Omori様
コメントを頂きましてありがとうございます!
お役に立てて大変うれしく思います。
今後ともどうぞよろしくお願いいたします!