VBAメモ 数千ある各列の重複を削除

Rやpython、perlなどをその都度必要に応じて使えるように勉強してきたのですが、VBAは使ったことがありませんでした。大半の人が仕事のどこかでエクセルを使って、表を作成したり、計算をしたり報告書を書いたりしてるでしょう。なのでVBAなどのマクロが使えると無駄な繰り返し作業や入力・計算ミスなどが減らせて、作業効率の向上が期待できるので習得したいなと思っています。

そして単純反復作業が増えてきたのでVBAを使ってみました。

データは数千列×数百行、各列には不規則に列内でセルの内容が重複しているデータになります。

デモデータですがイメージとしてこんな感じです。目的としてはそれぞれの列ごとに列内で重複するデータを削除する。といったものです。

結果として各列重複するセルが無いようにします。

複数列を選択してその内のある列で重複する値があれば、行を削除する。といった目的のものは多くみられたのですが、各列ごとに列内の重複を削除するといった記事がパッと見つからなかったのでメモ程度に記事にします。

列数を指定していたりして汎用性のあるコードでは全くないのでそこら辺は他の方の記事を参考にして頂ければと思います。

コード

Sub 各列重複削除()
'
' 重複削除 Macro
' 各列の重複をそれぞれ削除
   
   For i = 1 To 9000
       Columns(i).Select
       ActiveSheet.Columns(i).RemoveDuplicates Columns:=1, Header:=xlYNo
   Next i

End Sub

流れとして、Columns().Selectで列指定、RemoveDuplicate関数で重複を削除。この処理をFor文で一列ごとに1~9000列まで続行という感じです。

各関数の使用方は

Columns(列番号)

列番号の部分には指定したい列番号を””で囲まずにColumns(3)のように記入します。もしくはColumns(”C”)のように直接列を指定することもできます。二つの例は同じ列を意味してます。そして.Selectと付けると指定した列を選択することが出来ます。

範囲.RemoveDuplicates (Array(列番号1 , 列番号2 , … 列番号n))

RemoveDuplicatesにはどの範囲を処理対象にするか、また複数列の中で何列目を重複削除の基準にするかの指示が必要になります。

範囲の部分に自分の処理を実行したいセル、つまり今回だとcolumns(i)が入ることになります。コードにはActiveSheetを付けていますがこれは、文字通り、処理するシートは開いて作業しているシートであることを指定しています。

列指定ではなく範囲指定のRange(x,y)や行指定のRows(i)なども使用可能です。

この方法を探し始めて、初めてVBAを触りました。記述の仕方などわからないことだらけだったので頑張って学んでいこうと思います。

誰かの役に立てばと時々更新します。


Reference