VBA

【ExcelVBA】連想配列(Dictionaryオブジェクト)をマスターしよう

ねぇもりさん、VBAで、配列とはちがう「連想配列」ってあるよね?

連想配列ってなぁに?

もり
もり
「キー」と「値」をペアにしたリストのことだよ

連想配列(Dictionaryオブジェクト)とは?

連想配列とは「キー」と「値」をセットで格納するオブジェクトのことです。Dictionaryオブジェクトを利用して連想配列を作ります。

連想配列を作ってみる

連想配列を作るためには、参照設定で「Microsoft Scripting Runtime」の参照が必要です。

Microsoft Scripting Runtimeの参照設定

 

DictionaryオブジェクトのAddメソッドで「キー」と「アイテム」を追加します。

Dictionaryオブジェクト.Add キー, アイテム

Dictionaryオブジェクトにキーとアイテムを追加する

シンプルな「連想配列」を作ってみます。このような人物情報を「リスト」にするイメージです。

Key Item
name Bob
age 25
hobby tennis

 

Dictionaryオブジェクトを作成し、「キー」と「アイテム」を追加します。変数名はpersonとします。

 

ローカルウィンドウで変数personの中身を確認します。Dictionary型で3つのアイテム(値)が追加されています。

 

Dictionaryオブジェクトのメソッドを使ってみる

2つのメソッドを紹介します。

Keysメソッド すべてのキーの配列を返す

Itemsメソッド すべてのアイテムの配列を返す

 

コードで確認してみましょう。

 

ローカルウィンドウで変数の中身を確認します。インデックス 0 ~ 2 の配列が作成されました。

 

配列の要素番号を指定して、中身を確認することもできます。

連想配列をExcelシートに書き出す

Dictionaryオブジェクトにキーとアイテムを追加し、その内容をExcelシートに書き出すサンプルコードです。

 

実行結果です。アクティブシートの2行目以降に書き込まれます。

DictionaryオブジェクトをExcelシートに書き出す

 

For~Nextステートメントで、personオブジェクトの要素数、処理を繰り返すのがポイントです。Countプロパティで要素数を取得します。

Countプロパティ

→Dictionaryオブジェクトのキーとアイテムの「組み合わせの数」を返す

 

Countプロパティの値は3です。

 

インデックス0~2の処理を繰り返したいので、For~Nextステートメントの繰り返し条件は0 To person.Count - 1となります。

Excelシートのデータから連想配列を作る

今度は逆のパターンです。Excelシートのデータから連想配列を作ります。

 

実行結果です。変数person(Dictionaryオブジェクト)にItem1~3 が作成されました。

 

【実践編】Dictionaryオブジェクトを利用して星座判定関数を作ってみる

へぇ~。「キー」と「値」がペアになった「リスト」なんだね。

でも、これって、どういう時に役立つのかな?

もり
もり
それじゃあ実践してみよう!お題は「星座判定関数を作る」だよ!

たとえば、2月19日~3月20日は「うお座」、3月21日~4月19日は「おひつじ座」のように、星座ごとに日付の範囲が決まっています。

日付を与えると星座を返す関数を作ってみます。

 

変数seiza(Dictionaryオブジェクト)の中身です。Item1~13 が作成されました。これが、星座の一覧表(リスト)の役割です。

VBAで星座のDictionaryオブジェクトを作る

変数seiza(Dictionaryオブジェクト)の中身

  • Key = 星座の日付範囲のend日付
  • Item = 星座名

(例)

  • 12/22 ~ 1/19 「やぎ座
  • 1/20 ~ 2/18 「みずがめ座
  • 2/19 ~ 3/20 「うお座
  • 3/21 ~ 4/19おひつじ座

For~Nextステートメントを使って、インデックスの0番目から検索します。①②の大小関係を順番にチェックします。

  1. 変数mmddの値( = 405)
  2. Keys(i) の値

インデックス 3 で①②の大小関係が逆転します。「320より大きく419以下」であるので、Items(3) の値 = “おひつじ座” が答えです。

Dictionaryオブジェクトの検索

 

まとめ:連想配列は「リスト」として使える

連想配列(Dictionaryオブジェクト)について紹介しました!

VBAの判定処理で、なんらかの「リスト」「一覧表」が必要な場合に役立ちますよ。ぜひ使ってみてくださいね。