Dictionaryを使った重複チェック

列に入力されている値をユニーク化したい時や、重複チェックしたい時って結構あります。
ワークシート関数のCOUNTIF使ったり、Findメソッド使ったりしても出来なくないですが、
Dictionaryオブジェクトを使うと便利です。

Dictionaryオブジェクトってなーに?

MSDNの説明です。

Dictionary オブジェクトは、PERL 関連の配列と同じです。
項目はデータの任意の形式で配列に保存されます。
各項目には、項目を一意に識別するためのキーが関連付けられます。
キーは、それぞれの項目を取り出すときに使用されます。キーは、配列以外の値を使用します。
通常では整数値または文字列を使用します。

MSDN Dictionaryオブジェクト

そうです、連想配列ってやつです、ハイ。
連想配列ってなーに?ってな方は、wikipedia:連想配列でも参照して下さい(;^ω^)

実際に使ってみる


の様なデータが格納されている列から

  • ユニークリストを作る
  • 重複してるセルに色を付ける
  • C列に、ユニークリストを出力する

って処理をさせるコードは、こんな感じになります。

Option Explicit

Sub LetsDictionary()

    Dim lngLastRow As Long
    Dim dic        As Object
    Dim strKey     As String
    Dim i          As Long
    Dim vv         As Variant
    
    '辞書を作る
    Set dic = CreateObject("Scripting.Dictionary")

    With ThisWorkbook.Worksheets(1)
        '定番の最終行取得テク
        lngLastRow = .Cells(65536, "A").End(xlUp).Row
        
        For i = 1 To lngLastRow
            strKey = .Cells(i, 1).Value
            '辞書に登録されていない時は
            If Not dic.Exists(strKey) Then
                '辞書に登録する。重複チェックしかしないので、Itemには何も格納しない。
                'Addメソッドで dic.Add strKey, Empty と書くのと等価
                dic(strKey) = Empty
            Else
                '既に辞書にキーが登録されている時は、背景色を赤にする
                .Cells(i, 1).Interior.ColorIndex = 3
            End If
        Next i
        'Keysメソッドでキーを配列として取得する
        vv = dic.Keys
        'B1セル以降にキーの配列を出力 ※Transposeは配列の行列変換
        .Cells(1, "C").Resize(UBound(vv) + 1).Value = WorksheetFunction.Transpose(vv)
        
    End With
    
    Set dic = Nothing

End Sub

実行すると…

こんな感じになります。

Dictionaryは色んな場面で使えるので、マスターすると重宝します。

Dictionaryオブジェクトの詳細は

MSDN Dictionaryオブジェクト
を参照して下さい。