連想配列ってなぁに?
Contents
連想配列(Dictionaryオブジェクト)とは?
連想配列とは「キー」と「値」をセットで格納するオブジェクトのことです。Dictionaryオブジェクトを利用して連想配列を作ります。
連想配列を作ってみる
連想配列を作るためには、参照設定で「Microsoft Scripting Runtime」の参照が必要です。
DictionaryオブジェクトのAddメソッドで「キー」と「アイテム」を追加します。
Dictionaryオブジェクト.Add キー, アイテム
Dictionaryオブジェクトにキーとアイテムを追加する
シンプルな「連想配列」を作ってみます。このような人物情報を「リスト」にするイメージです。
Key | Item |
---|---|
name | Bob |
age | 25 |
hobby | tennis |
Dictionaryオブジェクトを作成し、「キー」と「アイテム」を追加します。変数名はpersonとします。
1 2 3 4 5 6 7 8 9 10 11 |
Sub sample1() Dim person As Dictionary Set person = New Dictionary 'Dictionaryオブジェクトにキーとアイテムを追加する person.Add "name", "Bob" person.Add "age", 25 person.Add "hobby", "tennis" End Sub |
ローカルウィンドウで変数personの中身を確認します。Dictionary型で3つのアイテム(値)が追加されています。
Dictionaryオブジェクトのメソッドを使ってみる
2つのメソッドを紹介します。
Keysメソッド すべてのキーの配列を返す
Itemsメソッド すべてのアイテムの配列を返す
コードで確認してみましょう。
1 2 3 4 5 |
Dim arrKeys As Variant arrKeys = person.Keys Dim arrItems As Variant arrItems = person.Items |
ローカルウィンドウで変数の中身を確認します。インデックス 0 ~ 2 の配列が作成されました。
配列の要素番号を指定して、中身を確認することもできます。
1 2 3 4 5 |
'インデックス=1の Key は? ※インデックスは0からはじまる Debug.Print person.Keys(1) ' => age 'インデックス=2の Item は? Debug.Print person.Items(2) ' => tennis |
連想配列をExcelシートに書き出す
Dictionaryオブジェクトにキーとアイテムを追加し、その内容をExcelシートに書き出すサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub sample2() Dim person As Dictionary Set person = New Dictionary 'Dictionaryオブジェクトにキーとアイテムを追加する person.Add "name", "Bob" person.Add "age", 25 person.Add "hobby", "tennis" 'personの中身をシートの2行目以降に書き出す Dim i As Long For i = 0 To person.Count - 1 Cells(i + 2, 1).Value = person.Keys(i) Cells(i + 2, 2).Value = person.Items(i) Next i End Sub |
実行結果です。アクティブシートの2行目以降に書き込まれます。
For~Nextステートメントで、personオブジェクトの要素数、処理を繰り返すのがポイントです。Countプロパティで要素数を取得します。
Countプロパティ
→Dictionaryオブジェクトのキーとアイテムの「組み合わせの数」を返す
Countプロパティの値は3です。
1 |
Debug.Print person.Count ' => 3 |
インデックス0~2の処理を繰り返したいので、For~Nextステートメントの繰り返し条件は0 To person.Count - 1
となります。
Excelシートのデータから連想配列を作る
今度は逆のパターンです。Excelシートのデータから連想配列を作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub sample3() Dim person As Dictionary Set person = New Dictionary Dim key As String, item As String Dim lastRow As Long lastRow = Cells(1, 1).End(xlDown).Row Dim i As Long For i = 2 To lastRow '2行目~最終行 key = Cells(i, 1).Value item = Cells(i, 2).Value 'Dictionaryオブジェクトにキーとアイテムを追加する person.Add key, item Next i End Sub |
実行結果です。変数person(Dictionaryオブジェクト)にItem1~3 が作成されました。
【実践編】Dictionaryオブジェクトを利用して星座判定関数を作ってみる
でも、これって、どういう時に役立つのかな?
たとえば、2月19日~3月20日は「うお座」、3月21日~4月19日は「おひつじ座」のように、星座ごとに日付の範囲が決まっています。
日付を与えると星座を返す関数を作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Sub main() Debug.Print SeizaCheck(DateSerial(2019, 4, 5)) ' => おひつじ座 End Sub Function SeizaCheck(ByVal checkdate As Date) As String Dim mmdd As Long mmdd = Format(checkdate, "mmdd") '日付を数値に変換 Debug.Print mmdd ' => 405 Dim seiza As Dictionary Set seiza = New Dictionary 'Dictionaryオブジェクトにキーとアイテムを追加する seiza.Add 119, "やぎ座" seiza.Add 218, "みずがめ座" seiza.Add 320, "うお座" seiza.Add 419, "おひつじ座" seiza.Add 520, "おうし座" seiza.Add 621, "ふたご座" seiza.Add 722, "かに座" seiza.Add 822, "しし座" seiza.Add 922, "おとめ座" seiza.Add 1023, "てんびん座" seiza.Add 1122, "さそり座" seiza.Add 1221, "いて座" seiza.Add 1231, "やぎ座" '判定 Dim i As Long For i = 0 To seiza.Count - 1 If mmdd <= seiza.Keys(i) Then SeizaCheck = seiza.Items(i) Exit Function End If Next i End Function |
変数seiza(Dictionaryオブジェクト)の中身です。Item1~13 が作成されました。これが、星座の一覧表(リスト)の役割です。
変数seiza(Dictionaryオブジェクト)の中身
- Key = 星座の日付範囲のend日付
- Item = 星座名
(例)
- 12/22 ~ 1/19 「やぎ座」
- 1/20 ~ 2/18 「みずがめ座」
- 2/19 ~ 3/20 「うお座」
- 3/21 ~ 4/19「おひつじ座」
For~Nextステートメントを使って、インデックスの0番目から検索します。①②の大小関係を順番にチェックします。
- 変数mmddの値( = 405)
- Keys(i) の値
インデックス 3 で①②の大小関係が逆転します。「320より大きく419以下」であるので、Items(3) の値 = “おひつじ座” が答えです。
まとめ:連想配列は「リスト」として使える
連想配列(Dictionaryオブジェクト)について紹介しました!
VBAの判定処理で、なんらかの「リスト」「一覧表」が必要な場合に役立ちますよ。ぜひ使ってみてくださいね。