VBAと日々のこぼれ話

  1. VBA

【ExcelVBA】リストの重複チェックをしたい

削除する前にチェックしたい

以前、無条件に重複を削除したリストを作成する方法を紹介しました。

ですが、削除する前に重複しているデータは何かをチェックすることも多いのではないでしょうか。

今回は削除する前にどのデータが重複しているかをチェックする処理です。

重複チェック処理の方法

Excelの重複データチェックを実施する際には、Excel関数のCountIf関数をよく使われます。

王道の方法で、チェック対象行数分「=IF(COUNTIF($A$2:A2,A2)>1,”重複”,””)」といった数式を埋め込む方法です。

この方法の唯一の欠点として挙げられるのは、対象行数分、式を埋め込まないといけないことでしょうか。

作業的には、セルをドラッグしてコピーするだけなので手間はかかりません。

ですが、数式の量によってはブックの再計算が始まるとととんでもなくExcelが重くなることがあります。

回避方法としてブックの計算方法を手動にするという方法もありますが、他の関数も使用している・規定値をむやみに変更したくないとの理由から同じ処理を行ってくれるマクロを考えてみました。

【スポンサーリンク】



サンプルコードの前提

チェック対象行数分「=IF(COUNTIF($A$2:A2,A2)>1,”重複”,””)」といった数式を埋め込む方法と同じ動きをするサンプルコードです。

この処理の動きでポイントとなるのは、『重複したデータ全てではなく「対象範囲を上から検索して2回目以降に登場したデータに「重複」という目印」がつくこと』ですね。

重複しているが1回目に登場したデータは重複とみなさないをどう判断するかにちょっと頭をひねらなければなりませんが、実は全て「重複なしリストの作成」の応用になります。

チェックしたいデータは、testシートの単一列(A列)
testシートの最終行が8行目(ヘッダー含む)とあらかじめ分かっているとみなす

今回は単一列の重複確認としていますが、下記のサンプルコードにちょっと手を加えれば複数列の重複チェックにも対応できます。

サンプルコード

【スポンサーリンク】



サンプルコード解説

①重複データをリスト化する

Excelのデータを上から1件ずつ取得し、重複なしのDictionaryオブジェクトへ登録します。

その際に登録チェック(.Exists)を実施し、重複なしのDictionaryオブジェクトに既登録であれば、重複ありのDictionaryオブジェクトへ登録します。

重複なしのDictionaryオブジェクトは、重複ありのDictionaryオブジェクト登録用のふるいなので今回は登録だけして使用しませんが、機能を追加していけば有効活用できると思います。

また重複ありのDictionaryオブジェクトもユニークにしたいので登録チェック(.Exists)を行います。

②重複データ全てに対してB列に「重複」を設定する

Excelのデータを上から1件ずつ取得し、重複ありのDictionaryオブジェクトに登録されているデータかチェックします。

そして、既登録=重複とみなされたデータは、B列の同行に「重複」と設定されますが、ここでは重複しているデータは全てのB列に「重複」と設定された状態になります。

③先頭から1行ずつ重複リストを検索する

もう一度Excelのデータを上から1件ずつ取得し、重複ありのDictionaryオブジェクトに登録されているデータかチェックします。

ここでは、既登録=重複とみなされたデータの場合、B列の同行の値を削除します。

そして、更に重複ありのDictionaryオブジェクトから該当のデータを削除(.Remove)します。

この処理を実施する目的の1つは、1回目に登場したデータのB列から「重複」という目印を消すこと(重複とみなさない状態へ変更)です。

もう一つは、Dictionaryオブジェクトから該当のデータを削除(.Remove)することで、2回目以降に登場するデータの「重複」という目印を消さないことです。

これで重複したデータ全てではなく「対象範囲を上から検索して2回目以降に登場したデータに「重複」という目印」がついた状態が完成します。

【スポンサーリンク】



VBAの最近記事

  1. 【VBA】(VBAを始めたばかりの人が陥りがちな落とし穴) Excelシートの最終行を取得…

  2. 【VBA】QRコードを作成したい

  3. 【VBA】CSVを1行ずつ処理したい

  4. Excelシートの最終行を取得したい その1

  5. 【VBA】未だに苦手としていること

関連記事

【スポンサーリンク】




PAGE TOP