VBA Dictionaryの使い方 Dictionaryの準備とデータの登録~マクロ講座

マクロ講座VBA Dictionaryの使い方

VBA Dictionaryの使い方
VBA Dictionaryの使い方

マクロ 93回

Dictionary(連想配列)をつかって作業を高速化

連想配列のメリットは何か。
連想配列ではインデックスの部分に、文字によるキーを設定することが前提です。
そしてその文字に対応するデータを参照するという形なので、文字でつまり言葉で検索ができるのが最大のメリットでしょう
人は「ねぇ1番どこにある?」とか「130番は何個残ってる?」と言われるよりも、 USB メモリーはどこにあるとか、レトルトカレーの在庫は何個なのと聞かれる方が理解が早いわけです。
(サンプルファイルは、こちらから マクロ93回サンプルデータ

  1. Dictionaryを使う方法は2通り
  2. Dictionaryにキーとアイテムを登録する
  3. 登録したKeyキーとitemアイテムを出力する
  4. ワークシートのデータからDictionaryに一括登録
  5. 取得したDictionaryをシートに書き出し

Dictionaryを使うには

  1. Dictionaryを使う方法には、2通りあります。
    ひとつ目は、 「CreateObject関数」を使う方法です。こちらは事前準備なしで使えます。
    もうひとつは、「参照設定」して Microsoft scripting runtimeを使う方法です。
    以下のコードは CreateObject関数を使った場合のコードです

    Sub dict01_a()
        With CreateObject("Scripting.Dictionary") ' CreateObject関数を使った方法
    ' ここにデータを入れる
        End With
    End Sub
    Sub dict01_a2()
     ' CreateObject関数を使った方法
     '辞書を変数にする場合
        Dim dic
        Set dic = CreateObject("Scripting.Dictionary")
    ' ここにデータを入れる
    End Sub

    CreateObject関数を使う場合には、参照設定が不要なので、VBAに詳しくない人とブックを共有しなければならない場合などには、よいかもしれません。

  2. 参照設定をしてDictionaryを使う
    Microsoft scripting runtimeを参照設定する場合は、 Visual Basic Editor のメニューにあるツールをクリックして、参照設定を開きます。
    参照設定ダイアログボックスが表示されたら、参照可能なライブラリファイルから Microsoft scripting runtime を選択して、チェックを入れてます
    以上で dictionary が使えるようになります。

    VBA Dictionaryの使い方、タイトル01
  3. Dictionaryにキーとアイテムを登録する

  4. 次に、CreateObject関数を使用してDictionaryオフジヱクトを作成します。
    Addメソッドで項目を追加します。Addメソッドは、最初の引数がKey、2番目の引数がItemになります。
    peaches をキーとしてアイテムに50を登録する場合はこのように書きます。
    dic.Add "peaches", "50"

    Sub dict01_b()
        Dim dic As object
        Set dic = CreateObject("Scripting.Dictionary")
        dic.Add "peaches", "50"
        dic.Add "apricots", "80"
        dic.Add "watermelons", "20"
        MsgBox dic.Item("peaches")
    Set dic = Nothing  ' おきまり
    End Sub
    VBA Dictionaryの使い方、タイトル02

    この連想配列のキーには果物の名前が登録されているので、果物の個数を調べたい時にはitem propertyを使って
    dic.Item("peaches")
    と書けばピーチの個数が表示されます。

  5. Dictionaryにキーとアイテムを登録する【参照設定済みの場合】

  6. Microsoft scripting runtime を参照設定している場合は、宣言部分が違っています。
    メンバーの登録方法は同じです。

    Sub dict01_b2()
    Dim dic As New Scripting.Dictionary
        dic.Add "peaches", "50"
        dic.Add "apricots", "80"
        dic.Add "watermelons", "20"
        MsgBox dic.Item("peaches")
    Set dic = Nothing  ' おきまり
    End Sub
    VBA Dictionaryの使い方、タイトル03
  7. 実行すると次のようにメッセージボックスが表示されて、Key Peachesのアイテムが50と表示されます。

    VBA Dictionaryの使い方、タイトル04
スポンサーリンク
スポンサーリンク

登録したKeyキーとitemアイテムを出力する

  1. 連想配列に登録したKeyキーとitemアイテムを出力してみましょう。
    先ほどはメッセージボックスでしたので今回は、イミディエイトウィンドウに出力します。
    イミディエイトウィンドウに出力するには、 Debug.Print を使います。
    すべての連想配列に登録したアイテムを一括で取得するには、ループして取得します。
    「For Each~Next」で取得することも、「For~Next」で取得することもできます。
    はじめにFor Eachで取得してみましょう。

    Sub dict01_b2()
    Dim dic As New Scripting.Dictionary
        dic.Add "peaches", "50"
        dic.Add "apricots", "80"
        dic.Add "watermelons", "20"
        'For Each STATEMENT で取得
        Dim Menber
        For Each Menber In dic
            Debug.Print Menber & " " & dic(Menber) '
        Next
    Set dic = Nothing
    End Sub
    
    VBA Dictionaryの使い方、タイトル05

    連想配列に登録したKeyキーとitemアイテムを出力For文を使った構文

    Dictionary
  2. つづいて For 文でDictionaryに登録したメンバーを取得してみましょう。 for 文で回して取得するには、
    Dictionaryオブジェクトに登録された要素の数を取得する必要があります。数を取得
    するには DictionaryのCount メソッドがあります。
    コードの中でマイナス1としているのは dictionary の要素がゼロから始まるからです。
    でも要素の数は1から始まっているということでその差を引いているのです。

    Sub dict01_b3()
    Dim dic As New Scripting.Dictionary
        dic.Add "peaches", "50"
        dic.Add "apricots", "80"
        dic.Add "watermelons", "20"
        ' For STATEMENT で取得
        Dim i As Long   
        For i = 0 To dic.Count - 1
            Debug.Print dic.Keys(i) & " : " & dic.Items(i)
        Next
    Set dic = Nothing  '
    End Sub

    VBA Dictionaryの使い方、タイトル06
  3. Dictionaryのキーとアイテムをセルに書き出す場合

  4. セルに書き出す場合は、
    Debug.Print dic.Keys(i) & " : " & dic.Items(i)の部分を次のように書き換えることでセルに出力できます。
    Cells(i + 1, 1).Value = dic.Keys(i)
    Cells(i + 1, 2).Value = dic.Items(i)

    Sub dict01_c1()
        Dim dic As New Scripting.Dictionary  'Microsft scriptingRuntime を使った場合
        dic.Add "peaches", "50"
        dic.Add "apricots", "80"
        dic.Add "watermelons", "20"
        For i = 0 To dic.Count - 1
            Cells(i + 1, 1).Value = dic.Keys(i)
            Cells(i + 1, 2).Value = dic.Items(i)
        Next
        Set dic = Nothing
    End Sub
    VBA Dictionaryの使い方、タイトル07
スポンサーリンク
スポンサーリンク

ワークシートのデータからDictionaryに登録

  1. ワークシートにDictionaryに登録したいデータがすでにあります。これをまず配列で取得します。

    VBA Dictionaryの使い方、タイトル08
  2. 配列で取得した要素をDictionaryに追加していきます。

    VBA Dictionaryの使い方、タイトル09
  3. 2回目のFor文で、取得したDictionaryをシートに書き出しています。

    VBA Dictionaryの使い方、タイトル10
  4. シートに書き出しました。

    VBA Dictionaryの使い方、タイトル01