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オブジェクトの詳細は
MSDN Dictionaryオブジェクト
を参照して下さい。