VBA【連想配列】の使い方を解説【”爆速”配列内検索】を簡単に習得

VBAの「連想配列(Dictionary)」の使い方について解説します。

配列の中身を検索すると、遅いし、繰り返し処理のコードを書くのめんどうですよね。

そこで、「連想配列」を使用すると、配列内の検索処理がかなり速くなり
検索コードも簡単でかなり便利です。

配列と似ているようで少し違いますが、覚えるとVBA高速化が簡単にできてしまいます。

配列の中身を検索していて、処理が遅いとお困りの場合は、「連想配列」に置き換えるべきです。

「連想配列」のサンプルコードもありますので、テンプレートとして使用可能です。

連想配列は、配列自体を理解していないと、難しいと思うので
不安な方は、こちらの記事をごらんください。

◆連想配列とは

VBAにおける連想配列とは、電子辞書みたいなものです。

任意の文字で検索すると、高速で登録したデータが読出しできるのです。

アナログな分厚い辞書だと検索に時間かかりますが
検索は高速なので、電子辞書に例えてみました。

「連想配列」の変数の型は「Dictionary」です。

連想配列(Dictionary)では、任意の文字が「Key(キー)」データが「Item(アイテム)」
表されています。

連想配列は、キーとデータがセットになっている構造です。

1つの連想配列にキーは絶対に重複できません。

なので、キーで検索をすると、そのキーに登録されたアイテムがすぐに出力可能です。

キーは変数アイテムはデータのようなイメージです。

例えば、「a」というキーに対して「10」というアイテムを登録します。

[A1]=Dic(“a”)

を実行すると、セルA1に「10」が出力されます。

◆連想配列サンプルコード

・サンプルコード

Sub 連想配列サンプルコード()
Dim Dic As New Dictionary '「Microsoft Scripting Runtime」にチェック
Dim DicAry, Keybuf As Variant, Itembuf As String

'●辞書登録範囲を確定
DicAry = [A1:B5]

'●辞書登録(空白 or 0 で終了)
For i = LBound(DicAry) To UBound(DicAry)
    If DicAry(i, 1) = "" Or DicAry(i, 1) = 0 Then Exit For
    Keybuf = DicAry(i, 1)
    Itembuf = DicAry(i, 2)
    '登録がなければ登録
    If Not Dic.Exists(Keybuf) Then Dic.Add Keybuf, Itembuf
Next i

''●辞書検索
'Keybuf = ""
'SearchItem = Dic(Keybuf)
'
''●アイテムを更新
'Keybuf = ""
'Itembuf = 10
'Dic(Keybuf) = Itembuf

End Sub

セルに入力されている値をDictionary型の連想配列に登録するサンプルコードです。

・解説

繰り返し処理にて、連想配列内に登録されていないキーだったら、新たにキーを登録します。

・キーとアイテムの登録方法

今回は、「変数:Dic」を連想配列としています。

If Not Dic.Exists(Keybuf) Then Dic.Add Keybuf, Itembuf

という処理で、連想配列にキーとアイテムを登録しています。

「If Not Dic.Exists(Keybuf) Then」

という処理で、連想配列内に登録されていないキーかどうかチェックしています。

この処理を省いて、既に登録されているキーを登録しようとすると、エラーになりますので
登録済みのキーか確認しておくことをオススメします。

・検索方法

連想配列内を検索したい時は
コメント「’●辞書検索」の下の「変数:Keybuf」に検索したいキーを入力すれば
一緒に登録したアイテムを出力することができます。

・アイテムの更新

登録したキーのアイテムを更新したい時は
コメント「’●アイテムを更新」の下の「変数:Keybuf」に更新したいキーを入力し
「変数:Itembuf」に登録したいデータ入力すれば
登録したキーを更新する事ができます。

これを応用すれば、連想配列でSUMIF関数のように指定した値の合計も可能です。

VBAって「[A1:B5]」でセルの指定できるの?って疑問に思いますよね。

気になりますよね。

こちらの記事で紹介していますのでご覧ください。

◆連想配列のエラー

・ユーザー定義型は定義されていません。

参照設定 エラー ユーザ定義型は定義されていません。

連想配列を実行時によく出るエラーが「ユーザー定義型は定義されていません。」です。

このエラーの対処法は簡単で、参照設定で「Microsoft Scripting Runtime」にチェックを入れるだけです。

参照設定は、VBEの上部メニューバーの
「ツール」→「参照設定」から設定する事ができます。

VBA 参照設定 VBE

「変数 As New Dictionary」の型を使用する際は、気をつけてくださいね。

あれ?「VBE」と「VBA」、「マクロ」と「VBA」って違うの? 違いは何?

と思った方は、こちらの記事で解説していますのでご覧ください。

◆まとめ

簡単にですが、連想配列の使い方をまとめました。

連想配列は、高速検索が可能な辞書としても使えるし、SUMIF関数のような処理も高速にできます。

連想配列の基本的な使用方法は、VBAで「VLOOKUP関数」のような処理をしたい時には、オススメです。

VBAの処理を高速化したい方は、必須になります。

VBA高速化のテクニックではなく、知識として覚えましょう。

これを読んでも解決できない方、なにか不明点がある場合は
コメントして頂くか、こちらからお問い合わせしてください。

“VBA【連想配列】の使い方を解説【”爆速”配列内検索】を簡単に習得” への2件の返信

  1. メールにてアドバイス頂きありがとうございます
    配列内の値検索を連想配列にすると高速化できると言う事なのですが、連想配列がまだ理解できていないため、連想配列を使いこなせる様にサンプルを参考にして理解したいと思います
    何事も色々な技(工夫)があるというか、奥が深いと痛感しています

    1. お問い合わせありがとうございました。
      薮内様が作られたエクセルVBAを元にサンプルデータ作成もしていますので
      よろしければ、再度ご連絡ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です