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

マクロ講座VBA Dictionaryの使い方

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

マクロ 93回

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

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

動画 VBA Dictionary 連想配列ができるとなんかすごい!

無限の可能性を引き出す、VBAの連想配列!

  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