マクロ講座VBA Dictionaryの使い方

マクロ 93回
Dictionary(連想配列)をつかって作業を高速化
連想配列のメリットは何か。
連想配列ではインデックスの部分に、文字によるキーを設定することが前提です。
そしてその文字に対応するデータを参照するという形なので、文字でつまり言葉で検索ができるのが最大のメリットでしょう
人は「ねぇ1番どこにある?」とか「130番は何個残ってる?」と言われるよりも、 USB メモリーはどこにあるとか、レトルトカレーの在庫は何個なのと聞かれる方が理解が早いわけです。
(サンプルファイルは、こちらから
マクロ93回サンプルデータ)
動画 VBA Dictionary 連想配列ができるとなんかすごい!
無限の可能性を引き出す、VBAの連想配列!
- Dictionaryを使う方法は2通り
- Dictionaryにキーとアイテムを登録する
- 登録したKeyキーとitemアイテムを出力する
- ワークシートのデータからDictionaryに一括登録
- 取得したDictionaryをシートに書き出し
Dictionaryを使うには
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に詳しくない人とブックを共有しなければならない場合などには、よいかもしれません。
参照設定をしてDictionaryを使う
Microsoft scripting runtimeを参照設定する場合は、 Visual Basic Editor のメニューにあるツールをクリックして、参照設定を開きます。
参照設定ダイアログボックスが表示されたら、参照可能なライブラリファイルから Microsoft scripting runtime を選択して、チェックを入れてます
以上で dictionary が使えるようになります。次に、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
この連想配列のキーには果物の名前が登録されているので、果物の個数を調べたい時にはitem propertyを使って
dic.Item("peaches")
と書けばピーチの個数が表示されます。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
実行すると次のようにメッセージボックスが表示されて、Key Peachesのアイテムが50と表示されます。
Dictionaryにキーとアイテムを登録する
Dictionaryにキーとアイテムを登録する【参照設定済みの場合】
登録したKeyキーとitemアイテムを出力する
連想配列に登録した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
連想配列に登録したKeyキーとitemアイテムを出力For文を使った構文
つづいて 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
セルに書き出す場合は、
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
Dictionaryのキーとアイテムをセルに書き出す場合
ワークシートのデータからDictionaryに登録
ワークシートにDictionaryに登録したいデータがすでにあります。これをまず配列で取得します。
配列で取得した要素をDictionaryに追加していきます。
2回目のFor文で、取得したDictionaryをシートに書き出しています。
シートに書き出しました。