VBAを使うようになって、日常の業務が格段に早く終わるようになりました。
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 オブジェクトのメソッドは下記の通りです。
メソッド | 説明 |
---|---|
Add key, item | 新しいキー(key)を登録し、値(item)を関連付けます。 (キーが既に存在する場合はエラーになります。) |
Exists(key) | 指定したキー(key)が存在するかどうか、論理値(True/False)を返します。 |
Items | Dictionaryオブジェクトの値(item)全てを配列にして返します。 ※この時の配列のインデックス番号は0(ゼロ)から始まります。 「items()(インデックス番号)」で、指定したインデックス番号の値(item)を取得します。 |
Keys | Dictionaryオブジェクトのキー(key)全てを配列にして返します。 ※この時の配列のインデックス番号は0(ゼロ)から始まります。 「keys()(インデックス番号)」で、指定したインデックス番号のキー(key)を取得します。 |
Remove key | 指定したキー(key)と、値(item)を削除します。 (指定したキーが存在しない場合はエラーになります。) |
RemoveAll | 全てのキー(key)と値(item)を削除します。 |
Dictionary オブジェクトのプロパティは下記の通りです。
プロパティ | 説明 |
---|---|
Count | Dictionaryオブジェクトに登録された要素の数。 |
Item(key) | 【キー(key)が登録されている場合】 ・キー(key)に関連付けられた値(item)を取得します。 ・「Dictionaryオブジェクト.Item(key) =別の値」で、既存の値(item)を別の値に変更します。 【キー(key)が登録されていない場合】 新しいキー(key)を登録し、値(item)を関連付けます。 (キーが既に存在する場合でもエラーになりません。) いずれの場合も、「item」は省略可能。 |
Key(key) | キー(key)を他のキーに変更します。 |
CompareMode | キー(key)の区別に、大文字と小文字を区別するか否か指定。 vbBinaryCompare(0):大文字と小文字を区別します。 vbTextCompare(1) :大文字と小文字を区別しません。 |
Dictionary オブジェクトは普通の配列のように、宣言するだけ使用することはできません。
Dictionary オブジェクトを使用する方法は、以下の2つになります。
関数を利用して、Dictionary オブジェクトを使えるようにする方法です。
【利用方法】
Dim dic_d As Object Set dic_d = CreateObject("Scripting.Dictionary") ***変数「dic_d」を利用した処理*** Set dic_d = Nothing
【メリット】
【デメリット】
VBE画面の設定を利用する方法です。
【利用方法】
Dim dic_d As New Scripting.Dictionary ***変数「dic_d」を利用した処理*** Set dic_d = Nothing
【メリット】
【デメリット】
Dictionary オブジェクトにキー(key)を登録し、そのキー(key)に値(item)を関連付けることで、キー(key)やインデックス番号から値(item)を呼び出すことができるようになります。
Dictionary オブジェクトのキー(key)は重複不可の仕様のため、同じキー(key)を2つ以上登録することはできません。
また、キー(key)をセル値から指定する場合は、必ずセル番地の後ろに「.value」を付けなくてはいけません。(次項参照)
Dictionary オブジェクトにキー(key)を登録する方法には、Addメソッドを利用する方法、Itemプロパティを利用する方法の2つあります。
メソッド | 説明 |
---|---|
Add key, item | 新しいキー(key)を登録し、値(item)を関連付けます。 (キーが既に存在する場合はエラーになります。) |
Dictionaryオブジェクト.Add キー, 値
↑Dictionary オブジェクトに キー(key)を登録し、そのキー(key)に値(item)を関連付けます。
Dictinary オブジェクトのインデックス番号は「0」から始まります。
プロパティ | 説明 |
---|---|
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)に指定する値に配列ではなく、セルの値を指定する場合はセル番地の後ろに「.value」を付けなければいけません。
Dictionaryオブジェクト.Add range(”A1”).value, range(”B1”).value
Dictionary オブジェクトのキー(key)・値(item)には数値や値だけではなく、オブジェクトを指定することも可能なのです。「.Value」を省略してしまうと、Rangeオブジェクトがキー(key)・値(item)として登録されてしまいます。
複数の同じテキストをキー(key)を1つにまとめたかったのに、同じテキストのキー(key)が複数存在している場合は「.value」が抜けていることが原因です。
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
プロパティ | 説明 |
---|---|
Count | Dictionaryオブジェクトに登録された要素の数。 |
Dictionaryオブジェクト.Count
指定したDictionaryオブジェクトに登録された要素の数を返します。
下記例では、Dictionaryオブジェクト「dic_d」の要素数「5」を返します。
dic_d.Count
メソッド | 説明 |
---|---|
Keys | Dictionaryオブジェクトのキー(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)
メソッド | 説明 |
---|---|
Keys | Dictionaryオブジェクトのキー(key)全てを配列にして返します。 ※この時の配列のインデックス番号は0(ゼロ)から始まります。 「keys()(インデックス番号)」で、指定したインデックス番号のキー(key)を取得します。 |
Dictionaryオブジェクト.Keys()(インデックス番号)
keysメソッドで返されるキー(key)全体から、インデックス番号のキー(key)のみを取得します。
下記例では、Dictionaryオブジェクト「dic_d」のインデックス番号「3」から、キー(key)「かつ丼」を取得します。
dic_d.Keys()(3)
Dictionaryオブジェクトのインデックス番号は「0」から始まるため、インデックス番号「3」は4つ目のデータになります。
プロパティ | 説明 |
---|---|
Key(key) | キー(key)を他のキーに変更します。 |
Dictionaryオブジェクト.key(キー)="変更後のキー"
下記例では、Dictionaryオブジェクト「dic_d」のキー「かつ丼」を「いくら丼」に変更しています。
dic_d.Key("かつ丼") = "いくら丼"
メソッド | 説明 |
---|---|
Items | Dictionaryオブジェクトの値(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)
プロパティ | 説明 |
---|---|
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 | Dictionaryオブジェクトの値(item)全てを配列にして返します。 ※この時の配列のインデックス番号は0(ゼロ)から始まります。 「items()(インデックス番号)」で、指定したインデックス番号の値(item)を取得します。 |
Dictionaryオブジェクト.items()(インデックス番号)
itemsメソッドで返される値(item)全体から、インデックス番号の値(item)のみを取得します。
下記例は、Dictionaryオブジェクト「dic_d」のインデックス番号「3」から、値(item)「6」を取得します。
dic_d.items()(3)
Dictionaryオブジェクトのインデックス番号は「0」から始まるため、インデックス番号「3」は4つ目のデータになります。
プロパティ | 説明 |
---|---|
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
メソッド | 説明 |
---|---|
Remove key | 指定したキー(key)と値(item)を削除します。 (指定したキーが存在しない場合はエラーになります。) |
Dictionaryオブジェクト.Remove key
Removeメソッドにkeyを指定すると、Dictionary オブジェクトに登録されたキー(key)とキー(key)に関連付けられた値(item)を削除します。
指定したキー(key)が登録されていない場合は、エラーになるので、Existsメソッド(上項参照)を使用して、キー(key)があらかじめ登録されているか確認する必要があります。
下記例は、Dictionaryオブジェクト「dic_d」のキー「かつ丼」・値「6」を削除します。
dic_d.Remove ("かつ丼")
インデックス番号「3」のキーは「かつ丼」です。
メソッド | 説明 |
---|---|
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)