【VBA入門】Dictionaryオブジェクト(連想配列)の使い方

Dictionary(連想配列)って使ってますか?

連想配列はJavaScript、PHP、Pythonなどの言語でも使われていて、VBAでもDictionaryオブジェクトとして使うことができます。連想配列はキーとデータをセットで格納することができます

この記事では、Dictionary(連想配列)について

  • Dictionaryオブジェクトとは
  • Dictionaryの使い方
  • Dictionaryのkeyでソートする方法
  • Dictionaryオブジェクトを参照設定で使う方法

など基本的な内容から、応用的な使い方についても解説していきます。

今回はDictionary(連想配列)について、使い方をわかりやすく解説します。

Dictionaryオブジェクトとは

Dictionaryオブジェクトとはデータとキーをセットで格納するオブジェクトのことです。辞書、または連想配列とも呼びます。

配列はインデックス番号(添字)と要素の値がセットなのに対して、連想配列はキー(Key)とデータ(Item)がセットになっています。

配列のインデックス番号は0(ゼロ)から順に整数が割り当てられますが、連想配列のキーは指定することができて整数の他にも文字列などを指定することができます。

ただし、キーを重複させることはできません。

Dictionaryの使い方

Dictionaryオブジェクトを使うためのプロパティとメソッドについて一覧にしました。

プロパティ:

プロパティ説明
Count連想配列に格納された要素の数
Item(key)キーに関連付けられた項目
Key(key)キー
CompareModeキーを区別する際に、大文字と小文字を区別するか否か指定
vbBinaryCompare(0):大文字と小文字を区別
vbTextCompare(1):大文字と小文字を区別ぜず

Dictionaryオブジェクトはキーを重複させることはできませんが、CompareModeプロパティを使ってキーの大文字と小文字を区別するかどうか設定することができます。

メソッド:

メソッド説明
Add key, itemキーに項目を関連付けて追加
Exists(key)指定したキーが存在すればTrueを返す
Items連想配列の項目を配列にして返す
配列のインデックス番号は0(ゼロ)から
Keys連想配列のキーを配列にして返す
配列のインデックス番号は0(ゼロ)から
Remove keyキーと項目のペアを削除
RemoveAll全てのキーと項目を削除

それではDictionaryオブジェクトのプロパティやメソッドの使い方についてサンプルコードで確認していきましょう!

宣言、初期化、追加、参照する方法

Dictionaryオブジェクトを宣言し使用するためには、CreateObject関数を使ってオブジェクト型の変数に格納する必要があります。

Dim 連想配列名 As Object
Set 連想配列名 = CreateObject(“Scripting.Dictionary”)

なお、オブジェクト型の変数に格納するにはSetステートメントが必要です。

Dictionaryオブジェクトを初期化、および要素を追加するにはAddメソッドを使用します。

サンプルコードで確認しましょう。

Sub macro1()
    'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictionaryオブジェクトの要素の参照
    Dim str As String, i As Integer
    Dim Keys() As Variant
    Keys = myDic.Keys
    For i = 0 To 2
        str = str & Keys(i) & " : " & myDic.Item(Keys(i)) & vbCrLf
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_ini

このサンプルコードではCreateObject関数を使って、オブジェクト型変数myDicにDictionaryオブジェクトを格納しています。

myDicオブジェクトからAddメソッドを呼び出し、それぞれの要素のキーとデータを追加してます。myDicオブジェクトのKeysメソッドで返す配列をバリアント型の配列Keysに格納しています。

For文を使って配列Keysの要素を取得し、また取得したKeysの要素を指標にItemプロパティを使ってデータを取得しています。

For Each文を使って参照する方法

For Each文を使うともっと簡単な記述で要素を参照取得することができます。For Each文ではInでDictionaryオブジェクトのキーを取得することができます

取得したキーはバリアント型になります。

サンプルコードで確認していきましょう。

Sub macro2()
    'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictionaryオブジェクトの要素の参照
    Dim str As String
    For Each Var In myDic
        str = str & Var & " : " & myDic.Item(Var) & vbCrLf
    Next Var
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_ini

このサンプルコードでは、For Each文を使ってDictionaryオブジェクトmyDicのキーとデータを参照取得しています。

keysメソッドで返す配列を使用して記述するよりも手短に記述できています

Removeで削除する方法

次にRemoveメソッドを使って要素を削除する方法についてサンプルコードで確認していきましょう。

Sub macro3()
    'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictonaryオブジェクトの要素の削除
    myDic.Remove "orange"
    
    'Dictionaryオブジェクトの要素の参照
    Dim str As String
    For Each Var In myDic
        str = str & Var & " : " & myDic.Item(Var) & vbCrLf
    Next Var
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_remove

このサンプルコードでは、Removeメソッドを使って対象のキーを指定してDictionaryオブジェクトの要素を削除しています。

Existsで存在するか確認する方法

先ほどのサンプルコードでは、Dictionaryオブジェクトの要素を削除する際に要素が存在するか確認せずに削除しました。

もし要素がない場合に削除すると「アプリケーション定義またはオブジェクト定義」のエラーが発生します。

エラーが発生しないようにするために、要素が存在するか確認して削除することをオススメします。

要素が存在するか確認するにはExistsメソッドを使用します。

サンプルコードで確認していきましょう。

Sub macro4()
   'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictonaryオブジェクトの要素の削除
    Dim key As String
    key = "orange"
    If myDic.Exists(key) Then '存在するか確認
        myDic.Remove key
    Else
        MsgBox key & "は削除できません", vbInformation
    End If
    
    'Dictionaryオブジェクトの要素の参照
    Dim str As String
    For Each Var In myDic
        str = str & Var & " : " & myDic.Item(Var) & vbCrLf
    Next Var
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_remove

このサンプルコードでは、DictionaryオブジェクトmyDicからExistsメソッドを呼び出しています。

要素が存在するか確認したあとで、Removeメソッドを使って要素を削除しています。

Dictionaryのkeyでソートする方法

Dictionaryオブジェクトはソートするメソッドを実装していないので、記述作成する必要があります。

キーの値が数値の場合は、バブルソートやクイックソートなどで記述することもできますが、文字列の場合はStrComp関数を使って比較するなど複雑になってきて記述にも時間がかかります。

そこでオススメするのが、RangeオブジェクトのSortメソッドを使用する方法です。

エクセルシート上のソートを利用します。

それではサンプルコードで確認していきましょう。

Sub macro5()
    'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictionaryオブジェクトの要素をシートのセルにセット
    Dim i As Integer
    i = 1
    For Each Var In myDic
        Cells(i, 1).Value = Var
        Cells(i, 2).Value = myDic.Item(Var)
        i = i + 1
    Next Var
    
    'RangeオブジェクトのSortメソッドを使用
    Dim myrange As range
    Set myrange = range("A1:B" & myDic.Count)
    myrange.Sort key1:=range("A1")
    
    'Sort後の結果をシートのセルから取得表示
    Dim str As String
    Dim Keys() As Variant, Items() As Variant
    Keys = myDic.Keys
    Items = myDic.Items
    For i = 1 To myDic.Count
        Keys(i - 1) = Cells(i, 1).Value
        Items(i - 1) = Cells(i, 2).Value
        str = str & Keys(i - 1) & " : " & Items(i - 1) & vbCrLf
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_sort_sheet
dictionary_sort_info

このサンプルコードではまず、VBAで作成したDictionaryオブジェクトの要素をエクセルシートのセルに入力しています。次に、RangeオブジェクトSortメソッドを使用してエクセルシート上でDictionaryオブジェクトのキーをソートしています。

エクセルシートの実行結果を確認するとA列の値でB列もセットでソートされていることがわかります。

エクセルシート上のソートの結果を、元のDictionaryオブジェクトの要素に格納して出力表示しています。

Dictionaryオブジェクトを参照設定で使う方法

Dicotnaryオブジェクトは参照設定を行い、「New」句を使って作成することもできます。

参照設定を行う方法は下記のとおりです。

  • Microsoft Visual Basic for Applicationsの「ツール」メニューから「参照設定」をクリックします。
  • 「参照可能なライブラリファイル」から「Microsoft Scripting Runtime」にチェックします。
  • OKボタンをクリックし、「参照設定」ダイアログを閉じます。

「New」句を使った宣言は下記のとおりです。

Dim 連想配列名 As New Scripting.Dictionary

それではサンプルコードで確認していきましょう。

Sub macro6()
    'Dictionaryオブジェクトの宣言
    Dim myDic As New Scripting.Dictionary
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictionaryオブジェクトの要素の参照
    Dim str As String
    For Each Var In myDic
        str = str & Var & " : " & myDic.Item(Var) & vbCrLf
    Next Var
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_ini

このサンプルコードでは、DictionaryオブジェクトmyDicを「New」句を使って宣言しています。

まとめ

ここではDictionaryオブジェクト(連想配列)について説明しました。

連想配列は、キーとデータをセットで扱うことができるので便利です。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説