Excel VBAで重複データを削除する

2021年6月11日

重複データを削除するVBAのサンプルアプリです。重複データを一つずつ確認しながら手作業で削除するには大変な労力を要します。今回はVBAを使ってボタン一つで重複データを削除する方法について説明します。

重複データを取り除くサンプルアプリの説明

会社一覧に重複したデータが入力されていますが、「重複削除」ボタンをクリックすると右側に重複データが削除されたデータが表示されます。

重複削除で利用する Dictionary オブジェクト

Dictionaryオブジェクトを使うとキーとデータをセットで格納することができます。
別名「連想配列」と呼ばれています。
配列との違いは配列がインデックス番号と要素の値がセットなのに対して、連想配列はキーとデータがセットになっています。また連想配列はキーを重複させることはできません。

Dictionaryオブジェクトを使用するには以下のように記述します。
'オブジェクトを宣言
Dim Dic As Object
'CreateObject関数を使ってオブジェクト型の変数に格納
Set Dic = CreateObject(“Scripting.Dictionary”)

Dictionaryオブジェクトのプロパティ

プロパティ説明
Count連想配列に格納された要素の数
Item(key)キーに関連付けられたデータ
Key(key)キー
CompareModeキーを区別する際に、大文字と小文字を区別するか否か指定
vbBinaryCompare(0)  大文字・小文字、ひらがな・カタカナ、全角・半角を区別します
vbTextCompare(1)  大文字・小文字、ひらがな・カタカナ、全角・半角を区別しません

Dictionaryオブジェクトのメソッド

メソッド説明
Add key, itemキーに項目を関連付けて追加
Exists(key)指定したキーが存在すればTrueを返す
Items連想配列の項目を配列にして返す
配列のインデックス番号0(ゼロ)から
Keys連想配列のキーを配列にして返す
配列のインデックス番号0(ゼロ)から
Remove keyキーと関連付けられたデータのペアを削除
RemoveAll全てのキーと項目を削除

サンプルアプリのソースコード  コードの作成手順はこちら

Sub 重複削除()

  'ワークシートを指定する
   Dim Sh1 As Worksheet
   Set Sh1 = ThisWorkbook.Worksheets("Sheet1")

 '変数を定義します。
   Dim Dic, i As Long, K As Long, buf As String, Keys
 
 'Dictionaryオブジェクトの宣言
   Set Dic = CreateObject("Scripting.Dictionary")

  'データの最終行を取得        
   K = Sh1.Cells(Rows.Count, 2).End(xlUp).Row
   
 '重複データの排除 
   For i = 6 To K
    buf = Sh1.Cells(i, 2).Value
  '同じデータがなければbuf変数に追加
    If Not Dic.Exists(buf) Then
        Dic.Add buf, buf
    End If
   Next i
   
  '重複データを排除したデータを出力
    Keys = Dic.Keys
    For i = 0 To Dic.Count - 1
        Sh1.Cells(i + 5, 4) = Keys(i)
    Next i
    Set Dic = Nothing

  '重複削除データの並び替え
    Range("D4:D14").Sort _
        Key1:=Range("D4"), Order1:=xlAscending, _
        Header:=xlYes

End Sub