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
実行結果:
このサンプルコードでは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
実行結果:
このサンプルコードでは、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
実行結果:
このサンプルコードでは、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オブジェクト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
実行結果:
このサンプルコードではまず、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オブジェクトmyDicを「New」句を使って宣言しています。
まとめ
ここではDictionaryオブジェクト(連想配列)について説明しました。
連想配列は、キーとデータをセットで扱うことができるので便利です。
使いこなすことができるように、この記事を何度も参考にして下さいね!