Dictionary オブジェクト(連想配列) とは ビッグデータ高速処理を可能にする技 (Excel VBA)

VBAを使うようになって、日常の業務が格段に早く終わるようになりました。

Dictionary オブジェクト(連想配列)を使うようになって、ビッグデータ処理が格段に早く終わるようになりました。

ややこしいところも多いですが、本当に便利なオブジェクトです(#^.^#)

ここではDictionary オブジェクト(連想配列)の基本的な使い方をご説明させていただきます。

目次

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

通常の配列は、1つの要素に対して1つの値を登録することができます。

下記例でいうと、インデックス番号「0」の要素には、「きつねうどん」という値が入っています。

インデックス番号「0」を指定すると、「きつねうどん」という値を取り出すことができます。

Dictionary オブジェクトの場合、1つのキー(key)1つの値(item)を関連付けることができます。そして1つ目の要素から「0」から始まるインデックス番号が付きます。

keyは重複登録不可という仕様のため、ユニークなリストを作るのに利用できます。

下記例でいうと、key「きつねうどん」に、item「11」が入っています。そしてそのデータのインデックス番号は「0」です。

key「きつねうどん」を指定すると、item「11」を取り出すことができます。また、インデックス番号「0」を指定するとkey「きつねうどん」item「11」どちらの値も取り出すことができます。

Dictionary オブジェクトのメソッド・プロパティ

メソッド

Dictionary オブジェクトのメソッドは下記の通りです。

メソッド説明
Add key, item新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合はエラーになります。)
Exists(key)指定したキー(key)が存在するかどうか、論理値(True/False)を返します。
ItemsDictionaryオブジェクトの値(item)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
「items()(インデックス番号)」で、指定したインデックス番号の値(item)を取得します。
KeysDictionaryオブジェクトのキー(key)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
「keys()(インデックス番号)」で、指定したインデックス番号のキー(key)を取得します。
Remove key指定したキー(key)と、値(item)を削除します。
(指定したキーが存在しない場合はエラーになります。)
RemoveAll全てのキー(key)と値(item)を削除します。

プロパティ

Dictionary オブジェクトのプロパティは下記の通りです。

プロパティ説明
CountDictionaryオブジェクトに登録された要素の数。
Item(key)【キー(key)が登録されている場合】
・キー(key)に関連付けられた値(item)を取得します。
・「Dictionaryオブジェクト.Item(key) =別の値」で、既存の値(item)を別の値に変更します。
【キー(key)が登録されていない場合】
新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合でもエラーになりません。)
いずれの場合も、「item」は省略可能。
Key(key)キー(key)を他のキーに変更します。
CompareModeキー(key)の区別に、大文字と小文字を区別するか否か指定。
vbBinaryCompare(0):大文字と小文字を区別します。
vbTextCompare(1) :大文字と小文字を区別しません。

Dictionary オブジェクトを使う準備

Dictionary オブジェクトは普通の配列のように、宣言するだけ使用することはできません。

Dictionary オブジェクトを使用する方法は、以下の2つになります。

CreateObject 関数を利用する方法

関数を利用して、Dictionary オブジェクトを使えるようにする方法です。

【利用方法】

Dim dic_d As Object
Set dic_d = CreateObject("Scripting.Dictionary")

***変数「dic_d」を利用した処理***

Set dic_d = Nothing
  1. まず、変数「dic_d」をObjectとして宣言します。

    Dim dic_d As Object

  2. 次に、CreateObject関数を利用して、変数「dic_d」にDictionary オブジェクトをセットします。

    Set dic_d = CreateObject(“Scripting.Dictionary”)


    この記述をすることで、変数「dic_d」をDictionary オブジェクトとして使うことができます。

    例1:dic_d.Exists(key)→キー(key)の存在の確認します。
    例2:dic_d.Keys→Dictionary オブジェクトのキー(key)を配列にして返します。

  3. 処理の最後に、変数「dic_d」を解放します。

    Set dic_d = Nothing

【メリット】

  • 関数の利用だけで、簡単なコードの記述だけで利用することができます。
  • 参照設定をしていないPCでも使用することができます。

【デメリット】

  • VBE上でDictionary オブジェクトに関するインテリセンス機能(自動メンバー表示)が効かなくなります。

    ↓これがインテリセンス機能(自動メンバー表示)です。


    インテリセンス機能(自動メンバー表示)が働かないと、入力ミスの可能性が生じます。
    この機能が必要な方は、次にご紹介します参照設定をご利用ください。

参照設定を利用する方法

VBE画面の設定を利用する方法です。

【利用方法】

  1. VBE画面[ツール] ー [参照設定] をクリックします。



    「Microsoft Scripting Runtime」にチェックを入れて<OK>ボタンをクリックし
    ます。

  2. 参照設定が完了したら、下記コードの記述が可能になります。
    Dim dic_d As New Scripting.Dictionary
    
    ***変数「dic_d」を利用した処理***
    
    Set dic_d = Nothing
  3. 変数「dic_d」をDictionary オブジェクトとして宣言します。
    この記述をすることで、変数「dic_d」をDictionary オブジェクトとして使うことができます。

    Dim dic_d As New Scripting.Dictionary

    参照設定をしていないと、変数「dic_d」の宣言の処理でエラーが出てしまいます。
    「コンパイル エラー: ユーザ定義型は定義されていません。」

     
  4. 処理の最後に、変数「dic_d」を解放します。

    Set dic_d = Nothing

【メリット】

  • VBE上でDictionary オブジェクトに関するインテリセンス機能(自動メンバー表示)を使うことができます。
    メンバーが表示されるので、入力ミスが減ります。

【デメリット】

  • 参照設定をしていないPCだとエラーがでてしまいます。
    色々な環境で利用する場合は、CreateObject関数のご利用をおすすめします。

■スポンサーリンク

Dictionary オブジェクトに新しくキー(key)を登録し、値(item)を関連付ける

Dictionary オブジェクトにキー(key)を登録し、そのキー(key)値(item)を関連付けることで、キー(key)インデックス番号から値(item)を呼び出すことができるようになります。

Dictionary オブジェクトのキー(key)重複不可の仕様のため、同じキー(key)を2つ以上登録することはできません。

また、キー(key)セル値から指定する場合は、必ずセル番地の後ろに「.value」を付けなくてはいけません。(次項参照)

Dictionary オブジェクトにキー(key)を登録する方法には、Addメソッドを利用する方法、Itemプロパティを利用する方法の2つあります。

Addメソッドを利用する方法

メソッド説明
Add key, item新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合はエラーになります。)
Dictionaryオブジェクト.Add キー, 

↑Dictionary オブジェクトに キー(key)を登録し、そのキー(key)値(item)を関連付けます。

Dictinary オブジェクトのインデックス番号は「0」から始まります。

Itemプロパティを利用する方法

プロパティ説明
Item(key)【キー(key)が登録されている場合】
・キー(key)に関連付けられた値(item)を取得します。
・「Dictionaryオブジェクト.Item(key) =別の値」で、既存のitemを別の値に変更します。
【キー(key)が登録されていない場合】
新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合でもエラーになりません。)
いずれの場合も、「item」は省略可能。

Itemプロパティには、上記の通り色々な働きがあります。

キー(key)が登録されていない場合新しいキー(key)を登録し、値(item)を関連付けます。

キー(key)が登録されている場合、既存値(item)が別の新しい値に上書きされます。

ですので、登録済のキーが存在する場合でもエラーが出ません。Existsメソッドであらかじめキー存在確認をする必要がありません。

処理するデータ群に、同じkeyのデータが2つ以上ある場合、既存値(item)が上書きされることを考慮して使用しなければいけません。

「item」は省略することができます。

↓Itemを省略しない場合

Dictionaryオブジェクト.item(キー)= 

↓Itemを省略する場合

Dictionaryオブジェクト(キー)= 

キー(key)・値(item)にRangeオブジェクトが登録されないための「.value」の必要性

キー(key)や値(item)に指定する値に配列ではなく、セルの値を指定する場合はセル番地の後ろに「.value」を付けなければいけません。

Dictionaryオブジェクト.Add range(”A1”).value, range(”B1”).value

Dictionary オブジェクトのキー(key)・値(item)には数値や値だけではなく、オブジェクトを指定することも可能なのです。「.Valueを省略してしまうと、Rangeオブジェクトがキー(key)・値(item)として登録されてしまいます。

複数の同じテキストをキー(key)を1つにまとめたかったのに、同じテキストのキー(key)が複数存在している場合は「.value」が抜けていることが原因です。

Dictionary オブジェクトに指定したキー(key)が登録されているか確認する

Dictionary オブジェクトのAddメソッドを実行する際、既に同じkeyが登録してあると、

実行時エラー’457′:
このキーは既にこのコレクションの要素に割り当てられています。

というエラーが出てしまいます。

そのエラーを回避するために、Existsメソッドを使用して登録済のキー(key)かどうか確認し、未登録の場合のみ、Addメソッドを行うようにします。

メソッド説明
Exists(key)指定したキー(key)が存在するかどうか、論理値(True/False)を返します。
Dictionaryオブジェクト.Exists(キー)

↑Dictionary オブジェクトにキー(key)が既に登録されていたら「True」を返し、登録されていなかったら「False」を返します。

下記例は キー(key)が dictinary オブジェクト「dic_c」に登録されていない(False)場合、If 内のAddメソッドを行います。

If dic_c.Exists(キー) =False Then
    dic_c.Add キー, 値
end if

Dictionary オブジェクトに登録されたキー(Key)の数をカウントする

プロパティ説明
CountDictionaryオブジェクトに登録された要素の数。
Dictionaryオブジェクト.Count

指定したDictionaryオブジェクトに登録された要素の数を返します。
下記例では、Dictionaryオブジェクト「dic_d」の要素数「5」を返します。

dic_d.Count


Dictionary オブジェクトに登録されたキー(key)をまとめて取得する

メソッド説明
KeysDictionaryオブジェクトのキー(key)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
「keys()(インデックス番号)」で、指定したインデックス番号のキー(key)を取得します。
Dictionaryオブジェクト.Keys

下記例は、Dictionaryオブジェクト「dic_d」のキー(key)全てを配列ary_keyに格納し、配列ary_keyからセル範囲A2:A6に書き出しています。

Dictionaryオブジェクトから配列にデータを格納すると1次元配列になるので、縦横を入れ替えるWorksheetFunction.Transposeメソッドを使用して、セルに書き出します。

ary_key = dic_d.Keys
Range("A2:A6") = Application.WorksheetFunction.Transpose(ary_key)


↓↓↓↓↓↓↓配列のインデックス番号は0(ゼロ)から始まります。

↓↓↓↓↓↓↓↓↓↓↓

Dictionary オブジェクトに登録されたキー(key)を、インデックス番号を指定して取得する

メソッド説明
KeysDictionaryオブジェクトのキー(key)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
「keys()(インデックス番号)」で、指定したインデックス番号のキー(key)を取得します。
Dictionaryオブジェクト.Keys()(インデックス番号)

keysメソッドで返されるキー(key)全体から、インデックス番号のキー(key)のみを取得します。

下記例では、Dictionaryオブジェクト「dic_d」のインデックス番号「3」から、キー(key)「かつ丼」を取得します。

dic_d.Keys()(3)

Dictionaryオブジェクトのインデックス番号は「0」から始まるため、インデックス番号「3」は4つ目のデータになります。

Dictionary オブジェクトに登録されたキー(key)を変更する

プロパティ説明
Key(key)キー(key)を他のキーに変更します。
Dictionaryオブジェクト.key(キー)="変更後のキー"

下記例では、Dictionaryオブジェクト「dic_d」のキー「かつ丼」を「いくら丼」に変更しています。

dic_d.Key("かつ丼") = "いくら丼"

Dictionary オブジェクトに登録された値(item)をまとめて取得する

メソッド説明
ItemsDictionaryオブジェクトの値(item) 全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
「items()(インデックス番号)」で、指定したインデックス番号の値(item)を取得します。
Dictionaryオブジェクト.items

下記例は、Dictionaryオブジェクト「dic_d」の値(item) 全てを配列ary_itemに格納し、配列ary_itemからセル範囲A2:A6に書き出しています。

Dictionaryオブジェクトから配列にデータを格納すると1次元配列になるので、縦横を入れ替えるWorksheetFunction.Transposeメソッドを使用して、セルに書き出します。

ary_item = dic_d.items
Range("A2:A6") = Application.WorksheetFunction.Transpose(ary_item)


↓↓↓↓↓↓↓配列のインデックス番号は0(ゼロ)から始まります。

↓↓↓↓↓↓↓↓↓↓↓

■スポンサーリンク

Dictionary オブジェクトに登録された値(item)を、キー(key)やインデックス番号を指定して取得する

Itemプロパティでキー(key)を指定して取得

プロパティ説明
Item(key)【キー(key)が登録されている場合】
・キー(key)に関連付けられた値(item)を取得します。
・「Dictionaryオブジェクト.Item(key) =別の値」で、既存の値(item)を別の値に変更します。
【キー(key)が登録されていない場合】
新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合でもエラーになりません。)
いずれの場合も、「item」は省略可能。
Dictionaryオブジェクト.item(キー)

「item」は省略することができます。

Dictionaryオブジェクト(キー)

下記例では、Dictionaryオブジェクト「dic_d」のキー(key)「かつ丼」から、値(item)「6」を取得します。(下はitemを省略したものです。)

dic_d.item("かつ丼")
dic_d("かつ丼")

Itemsメソッドでインデックス番号を指定して取得

メソッド説明
ItemsDictionaryオブジェクトの値(item)全てを配列にして返します。
※この時の配列のインデックス番号は0(ゼロ)から始まります。
items()(インデックス番号)」で、指定したインデックス番号の値(item)を取得します。
Dictionaryオブジェクト.items()(インデックス番号)

itemsメソッドで返される値(item)全体から、インデックス番号の値(item)のみを取得します。

下記例は、Dictionaryオブジェクト「dic_d」のインデックス番号「3」から、値(item)「6」を取得します。

dic_d.items()(3)

Dictionaryオブジェクトのインデックス番号は「0」から始まるため、インデックス番号「3」は4つ目のデータになります。

Dictionary オブジェクトに登録された値(item)を変更する

プロパティ説明
Item(key)【キー(key)が登録されている場合】
・キー(key)に関連付けられた値(item)を取得します。
・「Dictionaryオブジェクト.Item(key) =別の値」で、既存の値(item)を別の値に変更します。
【キー(key)が登録されていない場合】
新しいキー(key)を登録し、値(item)を関連付けます。
(キーが既に存在する場合でもエラーになりません。)
いずれの場合も、「item」は省略可能。
Dictionaryオブジェクト.Item(キー) ="変更後の値"

「item」は省略することができます。

Dictionaryオブジェクト(キー) ="変更後の値"

下記例は、Dictionaryオブジェクト「dic_d」のキー「かつ丼」の値「6」を「8」に変更しています。(下はitemを省略したものです。)

dic_d.Item("かつ丼") = 8
dic_d("かつ丼") = 8

Dictionary オブジェクトに登録されたキー(key)と値(item)を削除する

メソッド説明
Remove key指定したキー(key)と値(item)を削除します。
(指定したキーが存在しない場合はエラーになります。)
Dictionaryオブジェクト.Remove key

Removeメソッドにkeyを指定すると、Dictionary オブジェクトに登録されたキー(key)とキー(key)に関連付けられた値(item)を削除します。

指定したキー(key)が登録されていない場合は、エラーになるので、Existsメソッド(上項参照)を使用して、キー(key)があらかじめ登録されているか確認する必要があります。

下記例は、Dictionaryオブジェクト「dic_d」のキー「かつ丼」・値「6」を削除します。

dic_d.Remove ("かつ丼")

インデックス番号「3」のキーは「かつ丼」です。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
キー「かつ丼」が削除されると、インデックス番号「3」のキーは「中華そば」になります。

Dictionary オブジェクトに登録されたキー(key)と値(item)を全て削除する

メソッド説明
RemoveAll全てのキー(key)と値(item)を削除します。
Dictionaryオブジェクト.RemoveAll

RemoveAllメソッドを使うと、Dictionary オブジェクトに登録された全てのキー(key)と値(item)を削除します。

キー(key)と値(item)を全て削除しても、Dictionary オブジェクトは中身が空っぽのまま使える状態です。

Dictionary オブジェクトを使用することがないのでしたら、「Nothing」として、メモリ上から消オブジェクト自体を削除します。

Set Dictionaryオブジェクト = Nothing

参考

Dictionary オブジェクト(連想配列) とは ビッグデータ高速処理を可能にする技 (Excel VBA)
セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う1~ (Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う2~ (Excel VBA)
Dictionary オブジェクト(連想配列) CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止(Excel VBA)

■スポンサーリンク

■ランキングに参加しています。
↓このブログを気に入っていただけましたら、ポチッとお願いします。
人気ブログランキングへ