6-6.連想配列(Collection)

今回は、連想配列のCollectionオブジェクトについて説明します。

Collectionオブジェクトは、前回紹介したDictionaryオブジェクトと似ていますが、それぞれ固有の構造を持っています。

Collectionオブジェクトの構造

Collectionオブジェクトは、1つの要素にitemとkeyのペアを持つデータ構造となっています。
itemとkeyが1つのデータセットとして格納されているので、keyを検索値としてitemを取得するような処理に利用します。

Collectionオブジェクトの特徴として、以下が挙げられます。
keyは省略することができます
・1つの連想配列内で、同じkeyを持つことができません。keyは一意である必要があります。
・異なるkeyで同じitemのデータを持つことは可能です。
・keyにはオブジェクト型や文字列を格納できますが、数値のデータは格納できません
・itemに格納できるデータは、単一データのみでなく、配列構造のデータを格納することができます。
 したがって、1つのkeyで複数のitemを扱うことができます。

CollectionオブジェクトとDictionaryオブジェクトの違いは、keyとitemの順番やkeyに格納できるデータ型の制限、後述する宣言の方法やメソッドに違いがあります。

Collectionオブジェクトの宣言

Collectionオブジェクトの宣言は、通常の変数の宣言とほぼ同じです。

○構文
Dim 変数名 as New Collection

または

Dim 変数名 as Collection
Set 変数名 = New Collection

データの格納

Collectionオブジェクトにデータを格納する際は、Addメソッドを使用します。

Addメソッド

○構文
Collection.Add item,key,before,after

引数itemは必須です。keyは省略可能です。
before/afterのいずれかに指定したインデックスに要素を追加します。省略可能です。

<keyにセル値を格納する場合>
Dictionaryオブジェクトと同様、keyにセル値を格納する場合は、Valueプロパティを省略しないように注意しましょう。

Valueプロパティを省略してしまうと、Rangeオブジェクトそのものが格納されてしまいます。

<keyの存在チェック>
Collectionオブジェクトは、DictionaryオブジェクトのExistsメソッドのように、keyが既にdicに格納されているかkeyの存在チェックを行うメソッドを持ちません。
keyが格納されているかどうかは、全要素を反復処理で取り出して確認するか、Addメソッドでエラーキャッチ※する方法などがあります。

※エラーキャッチ:エラーが発生したことを捉えることを指します
 あえてエラーを発生させて特定の処理を実行する際に利用します

Sub データの格納()
    
    '宣言
    Dim cll As New Collection
    
    'データの格納
    cll.Add "item", "key"
    
    'keyの存在確認
    On Error Resume Next 'エラー発生時に処理を中断せず続行する構文
    
    cll.Add "item", "key"  '既にkeyが存在する場合、エラーになります
    If Err.Number <> 0 Then 'エラーが発生していない場合は、Err.Number=0になります
        MsgBox "keyは格納されています"
    End If
    
End Sub

データの取得

Collectionオブジェクトでは、itemメソッドを使用してitemを取得することができます。
itemメソッドに取得したいkeyやインデックスを指定します。インデックスは1から始まります。
keyの取得はできません。

itemメソッド

○構文
Collection.item(インデックス/key)
Collection(インデックス/key) ※itemメソッドは省略できます

Sub データの取得()
       
    '宣言
    Dim cll As New Collection
    
    'データの格納
    cll.Add "item", "key"
    
    'データの取得
    MsgBox cll.Item("key") '>>> "item"
    MsgBox cll("key") '>>> "item"

    MsgBox cll.Item(1) '>>> "item"
    MsgBox cll(1) '>>> "item"
    
End Sub

反復処理ですべての要素を取得

反復処理のFor Each文を使用して、Collectionオブジェクトのすべてのitemを取得できます。

○構文
For Each 変数 In Collection
Next

Sub 全ての要素を取得()
        
    '宣言
    Dim cll As New Collection
    Dim v As Variant
    
    'データの格納
    '省略
    
    '全ての要素を取得
    For Each v In cll
        MsgBox v
    Next v
    
End Sub

データの削除

データを削除するには、Removeメソッドを使用します。

Removeメソッド

○構文
Collection.Remove key/インデックス

○処理
引数に削除するkeyまたはインデックスを指定します。
引数に指定したkeyとそのペアのitemを削除します。

Sub データの削除()

    '宣言
    Dim cll As New Collection
    
    'データの格納
    cll.Add "item", "key"
    cll.Add "item2", "key2"
        
    'データの削除
    cll.Remove "key"
    
End Sub

その他のプロパティ

Countプロパティ

○構文
Collection.Count

○処理
Collectionオブジェクト内の要素数を返します。

コメント