重複しないユニークなリスト作成 ~ Dictionary オブジェクト(連想配列)を使う1~ (Excel VBA)

【本日のミッション】

Excel VBA を使って重複しないユニークなリストを作成せよ。
ただしピボットは使用せず、Dictionary オブジェクト(連想配列)を使うこと。

ミッションの概要

今回のミッションは、A列のメニューリストの重複しないユニークなメニュー名を、セルM2以下に書き出すことです。

→→→

通常、重複しないユニークなリストを作る場合、私はピボットテーブルを使用します。

ただ、VBAの処理の中で重複しないユニークなリストを作って、更に集計とかしないといけない・・・となると、ピボットテーブルの機能では汎用性が低くなります。

使いづらい!!

なので、VBAで重複しないユニークなリストを作る時は、Dictionary オブジェクト(連想配列)を使うようにしています。

Dictionary オブジェクト(連想配列)は処理スピードが速いです。ビッグデータ処理には大活躍してくれること間違いなしです。

プロシージャ

Sub 重複の無いユニークなリスト作成()

    '【変数】
    '配列関連
    Dim ary_d As Variant    '取り込みデータ用配列
    Dim ary_key As Variant  '書き出しkeyデータ用配列
    Dim dic_d As Object     'Dictionaryオブジェクト
    
    'その他
    Dim d_ct As Long        '配列ary_d用カウンター
    
    Application.ScreenUpdating = False
    
    '■データを配列ary_dに取り込み
    ary_d = Range("A2:A11")
    
    '■Dictionaryオブジェクトの準備
    Set dic_d = CreateObject("Scripting.Dictionary")
    
    '■配列ary_dをdic_dに格納
    For d_ct = 1 To UBound(ary_d, 1)
    
        '指定したキーがまだ登録されていなければ登録する
        If dic_d.Exists(ary_d(d_ct, 1))=False Then
            dic_d.Add ary_d(d_ct, 1), ""    'キー:ary_d(d_ct, 1)、値:空欄
        End If
    Next d_ct
    
    '■dic_d→配列ary_keyに格納
    ary_key = dic_d.Keys
    
    '■配列ary_keyをワークシートに書き出し(行列入替)
    Range(Range("M2"), Cells(dic_d.Count + 1, 13)) = Application.WorksheetFunction.Transpose(ary_key)
    
    '■dictinaryオブジェクトの解放
    Set dic_d = Nothing
    
    Application.ScreenUpdating = True
    
End Sub

セルA2~A11にデータを入れて、記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。

→→→

セルM2以下に、重複しないユニークなリストができあがりました(#^.^#)

Dictionary オブジェクト(連想配列)とは

通常の配列は、1つの要素に対して1つの値を登録することができます。

下記例でいうと、インデックス番号「 0」の要素には、「きつねうどん」という値が入っています。

インデックス番号「0」を指定すると、「きつねうどん」という値を取り出すことができます。

Dictionary オブジェクトの場合、1つのキー(key)1つの値(item)を関連付けることができます。そして1つ目の要素から「0」から始まるインデックス番号が付きます。

keyは重複登録不可という仕様のため、ユニークなリストを作るのに利用できます。

下記例でいうと、key「きつねうどん」に、item「11」が入っています。そしてそのデータのインデックス番号は「0」です。

key「きつねうどん」を指定すると、item「11」を取り出すことができます。また、インデックス番号「0」を指定するとkey「きつねうどん」item「11」どちらの値も取り出すことができます。

Dictionary オブジェクトのプロパティとメソッドは下記の通りです。

プロパティ説明
CountDictionaryオブジェクトに登録された要素の数。
Item(key)【キー(key)が登録されている場合】
・キー(key)に関連付けられた値(item)を取得します。
・「Dictionaryオブジェクト.Item(key) =別の値」で、既存の値(item)を別の値に変更します。
【キー(key)が登録されていない場合】
新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合でもエラーになりません。)
いずれの場合も、「item」は省略可能。
Key(key)キー(key)を他のキーに変更します。
CompareModeキー(key)の区別に、大文字と小文字を区別するか否か指定。
vbBinaryCompare(0):大文字と小文字を区別します。
vbTextCompare(1) :大文字と小文字を区別しません。

メソッド説明
Add key, item新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合はエラーになります。)
Exists(key)指定したキー(key)が存在するかどうか、論理値(True/False)を返します。
ItemsDictionaryオブジェクトの値(item)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
また、items()(インデックス番号)で、指定したインデックス番号の値(item)を取得します。
KeysDictionaryオブジェクトのキー(key)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
また、keys()(インデックス番号)で、指定したインデックス番号のキー(key)を取得します。
Remove key指定したキー(key)と値(item)を削除します。
(指定したキーが存在しない場合はエラーになります。)
RemoveAll全てのキー(key)と値(item)を削除します。

セル範囲を一気に変数(配列)に入れる方法

ary_d = Range("A2:A11")

これにつきましては、セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)で詳しい説明をさせて頂いております。

この方法でセル範囲を変数(配列)に入れた場合、配列ary_dのインデックス番号(添え字)は「1」から始まります。

もう少しDictionary オブジェクトにつきまして、詳しいお話をさせて頂きたいのですが、それはまた後日に・・・m(__)m
↓↓↓
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う2~ (Excel VBA)

参考

Dictionary オブジェクト(連想配列) とは ビッグデータ高速処理を可能にする技 (Excel VBA)
セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う1~ (Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う2~ (Excel VBA)
Dictionaryオブジェクト(連想配列) CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止(Excel VBA)

■スポンサーリンク

■ランキングに参加しています。
↓このブログを気に入っていただけましたら、ポチッとお願いします。
人気ブログランキングへ