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

【メリット】

  • 関数の利用だけで、簡単なコードの記述だけで利用することができます。

【デメリット】

  • 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

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

    Set dic_d = Nothing

【メリット】

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

【デメリット】

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

     
■■■スポンサーリンク■■■

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)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う1~ (Excel VBA)
重複しないユニークなリスト作成 ~Dictionaryオブジェクト(連想配列)を使う2~ (Excel VBA)
Dictionaryオブジェクト(連想配列) CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)をまとめて取得する(Excel VBA)
Dictionary オブジェクトに新しくキー(key)を登録し、値(item)を関連付ける(Excel VBA)
Dictionary オブジェクト 実行時エラー 457 を出さないために 指定したキー(key)が登録されているか確認する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)をインデックス番号から取得(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)を変更する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)をまとめて取得する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)を、キー(key)やインデックス番号を指定して取得する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録された値(item)を変更する(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)と値(item)を削除(Excel VBA)
Dictionary オブジェクト(連想配列)に登録されたキー(key)を一気に取得する(Excel VBA)
セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)

■■■スポンサーリンク■■■