ディクショナリオブジェクトを使用した重複データの削除

このページではディクショナリオブジェクトを使用した重複データの削除について説明します。重複データの削除は、データの存在チェックや追加が簡単に行えるディクショナリオブジェクトを使用すると簡単に行うことができます。

スポンサーリンク

処理の流れ

  1. データがディクショナリオブジェクトに登録済みか Exists メソッドでチェックする。
  2. 登録済みでなければ、ディクショナリオブジェクトへデータを新規登録(Add)する。
    登録済みの場合は必要に応じて何か処理(カウント数を加算するなど)を行う。
  3. 最後に Keys メソッドで重複を削除したデータをVariant型変数で配列として受け取る。

重複データ削除の例

以下の例では、アクティブシートA列にあるデータの重複を削除して、その結果をメッセージボックスに表示します。メッセージボックスには重複削除後のデータ数とデータの一覧、および重複の有無を表示します。

Sub sample_dc013_01()
    Dim dco         As Object
    Dim wRow        As Long
    Dim wKey        As String
    Dim varKeys     As Variant
    Dim i           As Long

    'ディクショナリオブジェクトの生成
    Set dco = CreateObject("Scripting.Dictionary")

    wRow = 1
    Do Until Cells(wRow, 1).Value = ""
        wKey = Cells(wRow, 1).Value
        If dco.Exists(wKey) Then
            '登録済みの場合はカウントアップ
            dco.Item(wKey) = CLng(dco.Item(wKey)) + 1
        Else
            '未登録の場合は新規登録
            'Value値はカウンターとして使用したいので、"1"をセット
            dco.Add wKey, 1
        End If

        wRow = wRow + 1
    Loop

    'キー項目の配列を取得
    varKeys = dco.Keys

    'カウント値から重複の有無を判定
    For i = 0 To UBound(varKeys)
        If dco.Item(varKeys(i)) > 1 Then
            'カウント値が1より大きければ重複あり
            varKeys(i) = varKeys(i) & vbTab & "(重複あり)"
        End If
    Next

    MsgBox "<重複データ削除結果>" & vbLf & _
            "重複削除後データ数・・・" & dco.count & "件" & _
            vbLf & vbLf & Join(varKeys, vbLf), vbInformation

    'ディクショナリオブジェクトの破棄
    Set dco = Nothing
End Sub

 Setステートメント  Do…Loop  For…Next
  MsgBox関数  LBound、UBound関数  Join関数 

下図はアクティブシートの状態です。A列にデータが入力されています。

sample_dc013_01の入力データ
sample_dc013_01の入力データ

上記サンプルマクロを実行すると、重複データを削除した結果がメッセージボックスに表示されます。

sample_dc013_01の実行結果
sample_dc013_01の実行結果

 ディクショナリオブジェクトのプロパティ・メソッド

タイトルとURLをコピーしました