【Excel VBA入門】Dictionaryとは?データ管理が楽になる連想配列の作り方

【Excel VBA入門】Dictionaryとは?データ管理が楽になる連想配列の作り方

Dictionaryとは?データ管理が楽になる連想配列の作り方

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

今回はキーと値をまとめて管理できるDictionaryオブジェクトを取り上げます。データをまとめて管理する方法として配列やCollectionオブジェクトを解説してきましたが、Dictionaryオブジェクトは一味違います。

本記事では、Dictionaryオブジェクトの基本はもちろん、配列やCollectionオブジェクトと比較した使いどころも解説します。

Dictionaryオブジェクトとは

Dictionaryオブジェクトとは、連想配列を使ってデータをまとめて管理できるオブジェクトです。

連想配列ってなに?

と疑問に思う方もいると思いますが、難しいものではありません。まとめて管理された値にラベル(=キー)が貼られているイメージです。

Dictionaryオブジェクトのイメージ

キー名で各要素を取得するため、キーの重複は許されません。キー名には配列以外の任意の形式が使えますが、通常は文字列整数です。

Dictionaryオブジェクトの宣言には、CreateObjectを使い、Scripting.Dictionaryを指定します。

Dim Dictionary名 As Object

Set Dictionary名 = CreateObject("Scripting.Dictionary")

要素を追加するにはAddメソッドを使う

要素を追加するにはAddメソッドを使って、キーと値を指定します。

Dictionary名.Add キー名, 追加したい値

例えば、姓、名、性別、年齢をキーに値を追加してみると以下のようになります。

Dim employee As Object

Set employee = CreateObject("Scripting.Dictionary")

employee.Add "姓", "山田"
employee.Add "名", "太郎"
employee.Add "性別", "男"
employee.Add "年齢", 20

Debug.Print "姓: " & employee("姓")
Debug.Print "名: " & employee("名")
Debug.Print "性別: " & employee("性別")
Debug.Print "年齢: " & employee("年齢")

キーの重複はExistsメソッドで確認

Dictionaryオブジェクトを使うときにはキー名の重複を避けねばなりません。Existsメソッドを使えばキー名の重複を簡単にチェックできます。

Dictionary名.Exists(キー名)

例えば、下記画像のような出勤表から従業員の出勤日数を計算してみましょう。

従業員の姓をキーにすることで、Existsメソッドで重複していれば値に出勤日数を1日加算します。

Dim employee As Object
Dim rng As Range
Dim key As Variant

Set employee = CreateObject("Scripting.Dictionary")

For Each rng In Range("B2:B9")
    ' すでに従業員が登録されていれば出勤日数を加算
    If employee.Exists(rng.Value) Then
        employee(rng.Value) = employee(rng.Value) + 1
    Else
        employee.Add rng.Value, 1
    End If
Next

For Each key In employee
    Debug.Print key & ": " & employee(key)
Next
実行結果

要素を削除するにはRemoveメソッドを使う

要素を削除するにはRemoveメソッドを使います。

Dictionary名.Remove(削除したいキー名)

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

キーや値の一覧を取得したいときもあるはずです。そんなときもDictionaryオブジェクトには専用のメソッドがあります。

キーの一覧を取得するにはKeysメソッド、値一覧を取得するにはItemsメソッドを使いましょう。それぞれ配列形式で一覧を取得できます。

‘ キーの一覧を取得するにはKeysメソッド
Dictionary名.Keys

‘ 値の一覧を取得するにはItemsメソッド
Dictionary名.Items

例えば、姓、名、性別をキーに値を入力したDictionaryを取り上げ、キーと値の一覧を取得してみます。

Dim employee As Object
Dim keys As Variant, items As Variant

Set employee = CreateObject("Scripting.Dictionary")

employee.Add "姓", "山田"
employee.Add "名", "太郎"
employee.Add "性別", "男"

' キーと値一覧を取得
keys = employee.keys
items = employee.items

Debug.Print "キー名一覧: " & Join(keys, ",")
Debug.Print "値一覧: " & Join(items, ",")
実行結果

For Eachでキーと値を取り出す

Dictionaryのキーと値を一緒に取り出すときはFor Eachが使えます。For Eachの変数部分にキーが入るので、Dictionaryにキーを指定することで値も取り出せます。

Dim employee As Object
Dim key As Variant

Set employee = CreateObject("Scripting.Dictionary")

employee.Add "姓", "山田"
employee.Add "名", "太郎"
employee.Add "性別", "男"

' キーと値をすべて取得
For Each key In employee
    Debug.Print key & ": " & employee(key)
Next
実行結果

Dictionaryオブジェクトの使いどころ

データをまとめて扱うにはDictionaryオブジェクト以外にも配列やCollectionオブジェクトがあります。あえてDictionaryを使う理由は、「連想配列の作成が簡単」の一言に尽きます。

連想配列を作成するときに便利

連想配列を作るには、キーの重複チェックが必要です。Collectionオブジェクトでも連想配列は作れますが、キーの重複を確認する方法はExistsメソッドを持つDictionaryオブジェクトしかありません

そのため、Dictionaryオブジェクトのほうが連想配列を作りやすいといえます。

一方、連想配列ではなく、動的な配列を作るときはCollectionオブジェクトがオススメです。配列よりも簡単にサイズを変更でき、要素の追加や削除も簡単だからです。

【Excel VBA入門】Collectionとは?サイズ変更に強いリストの作り方

また、Excelとデータのやり取りをするときは素直に配列を使いましょう。一度に複数のセル情報を取得、書き込む処理は配列が高速です。

【Excel VBA入門】配列とは?二次元配列を使った高速化手法も解説

まとめ

Dictionaryオブジェクトは連想配列の作成に特化したオブジェクトです。連想配列はCollectionオブジェクトでも作れますが、Dictionaryのほうが連想配列の操作に適したメソッドが揃っています。

VBAプログラム内でデータを管理するときにDictionaryオブジェクトを使えると、プログラムが読みやすくなってオススメです。本記事を読んでぜひマスターしましょう。