【VBA】連想配列 Scripting.Dictionary の使い方を徹底解説!

目次

はじめに

VBAの配列は、myArray(0) のように数値のインデックスでデータを管理します。しかし、「商品名」をキーにして「価格」を取り出す、といったように、文字列をキー(添え字)にしてデータを扱いたい場面は非常に多くあります。

このような「キーと値のペア」でデータを管理する仕組みを「連想配列」と呼びます。VBAで連想配列を実現するには、Scripting.Dictionary オブジェクトを利用するのが最も強力で一般的です。

この記事では、Dictionaryオブジェクトの基本的な使い方から、実用的な応用例までを網羅的に解説します。

【事前準備】 Dictionary を使うには、「参照設定」が必要です。VBEのメニューから「ツール」→「参照設定」を開き、「Microsoft Scripting Runtime」にチェックを入れてください。これにより、Dim dict As Dictionary のように Dictionary 型を直接使えるようになり、入力補完も効くため便利です。


Dictionaryオブジェクトの基本的な使い方

1. Dictionaryの作成

' Dictionaryオブジェクトを宣言し、新しいインスタンスを作成する
Dim productPrices As Scripting.Dictionary
Set productPrices = New Scripting.Dictionary

2. 項目の追加 (.Add)

.Add メソッドを使って、「キー」と、それに対応する「値(Item)」をペアで追加します。キーは重複できません

' .Add キー, アイテム
productPrices.Add "商品A", 1200
productPrices.Add "商品B", 850
productPrices.Add "商品C", 2100

3. 項目の値を取得

キーを指定して、対応する値を取得します。

' "商品B" の価格を取得
Dim price As Long
price = productPrices("商品B") ' または productPrices.Item("商品B")
MsgBox "商品Bの価格: " & price & "円" ' -> 850円

4. キーの存在確認 (.Exists)

指定したキーが既に存在するかどうかを True/False で確認します。.Add の前に重複をチェックする際に必須です。

If productPrices.Exists("商品D") Then
    MsgBox "商品Dは既に登録されています。"
Else
    productPrices.Add "商品D", 980
    MsgBox "商品Dを追加しました。"
End If

5. 項目数の取得 (.Count)

.Count プロパティで、Dictionary に格納されている項目数を取得できます。

MsgBox "登録されている商品数: " & productPrices.Count

キーと値の一覧を取得する

6. 全てのキーを取得 (.Keys)

.Keys メソッドは、Dictionary 内の全てのキーを格納した配列を返します。

Dim allKeys As Variant
allKeys = productPrices.Keys ' -> ("商品A", "商品B", "商品C", "商品D")

' Join関数と組み合わせて一覧表示
MsgBox "取扱商品一覧: " & Join(allKeys, ", ")

7. 全ての値(Item)を取得 (.Items)

.Items メソッドは、全ての値を格納した配列を返します。

Dim allPrices As Variant
allPrices = productPrices.Items ' -> (1200, 850, 2100, 980)

項目の削除

8. 特定の項目を削除 (.Remove)

キーを指定して、項目を削除します。

productPrices.Remove "商品C"
MsgBox "商品Cを削除しました。"

9. 全ての項目を削除 (.RemoveAll)

Dictionary の中身を全て空にします。

productPrices.RemoveAll
MsgBox "全ての商品を削除しました。"

実用例:重複を除いたリストの作成

Dictionary の「キーが重複できない」という特性は、重複を除いたユニークなリストを作成する際に絶大な威力を発揮します。

' D列の値から、重複を除いたリストを作成する
Sub CreateUniqueList()
    Dim uniqueList As Scripting.Dictionary
    Set uniqueList = New Scripting.Dictionary
    
    Dim cell As Range
    
    ' D2セルからD列の最終行までループ
    For Each cell In ActiveSheet.Range("D2", ActiveSheet.Cells(Rows.Count, "D").End(xlUp))
        ' まだキーとして登録されていなければ、追加する
        If Not uniqueList.Exists(cell.Value) Then
            uniqueList.Add cell.Value, "" ' 値は使わないので空でOK
        End If
    Next cell
    
    MsgBox "重複を除いたリスト:" & vbCrLf & Join(uniqueList.Keys, vbCrLf)
End Sub

まとめ

今回は、VBAで連想配列を実現する Scripting.Dictionary オブジェクトの網羅的な使い方を解説しました。キーと値のペアでデータを管理できるため、単純な配列よりも直感的で高速なデータアクセスが可能になる場面が多くあります。特に、重複チェックのロジックをシンプルに記述できる点は、実務において非常に強力です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次