このページではディクショナリオブジェクトを使用した重複データの削除について説明します。重複データの削除は、データの存在チェックや追加が簡単に行えるディクショナリオブジェクトを使用すると簡単に行うことができます。
処理の流れ
- データがディクショナリオブジェクトに登録済みか Exists メソッドでチェックする。
- 登録済みでなければ、ディクショナリオブジェクトへデータを新規登録(Add)する。
登録済みの場合は必要に応じて何か処理(カウント数を加算するなど)を行う。 - 最後に 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列にデータが入力されています。
上記サンプルマクロを実行すると、重複データを削除した結果がメッセージボックスに表示されます。