重複しないユニークなリスト作成 ~ 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)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う1~ (Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う2~ (Excel VBA)
Dictionaryオブジェクト(連想配列) CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)をまとめて取得する(Excel VBA)
Dictionary オブジェクトに新しくキー(key)を登録し、値(item)を関連付ける(Excel VBA)
Dictionary オブジェクト 実行時エラー 457 を出さないために 指定したキー(key)が登録されているか確認する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)をインデックス番号から取得(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)を変更する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)をまとめて取得する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)を、キー(key)やインデックス番号を指定して取得する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)を変更する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)と値(item)を削除(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)を一気に取得する(Excel VBA)
セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)

■■■スポンサーリンク■■■