Excel VBA コレクション(Collection)オブジェクトの使い方

ExcelVBA-基礎編

今回は「Collectionオブジェクト」についてご説明します。

CollectionはItem(データ)Key(キー)をセットで格納出来ます。

Collectionは、数値、文字列、オブジェクト等異なるデータ型を格納でき、独自のオブジェクトを作成する事ができます。

似たような機能として「Dictionary」があります。

1.Collectionオブジェクトとは

文頭でも記載していますが、CollectionオブジェクトはItem(データ)とKey(キー)を、セットで格納する事ができるオブジェクトです。

Collectionには数値、文字列やオブジェクトなど格納する事ができ、要素ごとに異なるデータ型を格納する事ができます。

Key(キー)は省略可能ですが、省略しない場合はKey(キー)は重複したKeyを格納する事ができません。

2.Collectionの使い方

宣言方法

Collectionの宣言は、2つの方法があります。

次のように記述します。

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

もしくは次のように記述します。

Dim 変数名 As New Collection

要素の追加(add)

Collectionに要素を追加するには、addメソッドを使用します。

構成は「add,Item,Key」となります。

Keyは省略できます。

DictionaryとItemとKeyが逆になりますので、ご注意下さい。

Sub Sample1()

Dim myCollect As Collection

Set myCollect = New Collection

With myCollect

    .Add "あいうえお", "ア行"
    .Add "かきくけこ", "カ行"
    .Add "さしすせそ", "サ行"
    .Add 12345, "数字1"
    .Add 67891, "数字2"

End With

End Sub

要素の削除(Remove)

Collectionの要素の削除には「Remove」を使用します。

削除する要素の指定はKeyもしくは、インデックス番号で指定します。

Sub Sample2()

Dim myCollect As Collection

Set myCollect = New Collection

With myCollect

    .Add "あいうえお", "ア行"
    .Add "かきくけこ", "カ行"
    .Add "さしすせそ", "サ行"
    .Add 12345, "数字1"
    .Add 67891, "数字2"

End With

myCollect.Remove "サ行"

End Sub

要素数の取得(Count)

Collectionの要素数を取得するには、「Count」プロパティを使用します。

Collection のインデックスは「1」から始まります

Sub Sample3()

Dim myCollect As Collection

Set myCollect = New Collection

With myCollect

    .Add "あいうえお", "ア行"
    .Add "かきくけこ", "カ行"
    .Add "さしすせそ", "サ行"
    .Add 12345, "数字1"
    .Add 67891, "数字2"
    
End With

MsgBox myCollect.Count

End Sub

Keyで要素を取得(Key)

Collectionの要素を取得するには、Keyもしくはインデックス番号で取得します。

注意しなければいけないのが、Keyを省略した場合はインデックス番号でのみ指定可能です。

Sub Sample4()

Dim myCollect As Collection

Set myCollect = New Collection

With myCollect

    .Add "あいうえお", "ア行"
    .Add "かきくけこ", "カ行"
    .Add "さしすせそ", "サ行"
    .Add 12345, "数字1"
    .Add 67891, "数字2"
    
End With

MsgBox myCollect("カ行")

End Sub

インデックスで要素を取得(Index)

Collectionの要素をインデックス番号で取得します。

Sub Sample5()

Dim myCollect As Collection

Set myCollect = New Collection

With myCollect

    .Add "あいうえお", "ア行"
    .Add "かきくけこ", "カ行"
    .Add "さしすせそ", "サ行"
    .Add 12345, "数字1"
    .Add 67891, "数字2"
    
End With

MsgBox myCollect(3)

End Sub

3.ループを使用したサンプルコード

基本的にはセルに入力されたデータを、Collectionに格納して扱う場面が多いと思います。

ループでItemを操作する方法をご説明します。

また、CollectionはループでKeyを取得できないようです。

For~Nextで要素を操作する

まず、For~Nextを使用した場合です。

セルA列に商品名、B列に価格が10個入力されたデータがあるとします。

まずは、ループでCollectionにKeyに商品名、Itemに価格を格納します。

ループの回数はCountで取得して、Itemを抽出します。

注意点は、A列商品名、B列価格の順番に対して、Collectionは「add Item,Key」と順番が逆になります。

Sub Sample6()

Dim myCollect   As Collection
Dim i           As Long

Set myCollect = New Collection

With myCollect

    For i = 2 To 11
            
            .Add Cells(i, 2), Cells(i, 1)
    
    Next i

End With

For i = 1 To myCollect.Count

    Debug.Print myCollect(i)

Next i

End Sub

For Each In Nextで要素を操作する

次はFor Each In Nextを使用したループです。

Collectionはオブジェクトなので、オブジェクトをループする場合はとても便利です.

Sub Sample7()

Dim myCollect   As Collection
Dim myCol       As Object
Dim i           As Long

Set myCollect = New Collection

With myCollect

    For i = 2 To 11
            
            .Add Cells(i, 2), Cells(i, 1)
    
    Next i

End With

For Each myCol In myCollect

    Debug.Print myCol

Next

End Sub

4.まとめ

Collectionオブジェクトは格納する要素のデータ型が異なる場合でも、格納する事ができますので、格納したいデータの型が様々なケースで使用すると非常に便利です。

ですが、ItemとKeyをセットで格納できるDictyonaryがあります。

CollectionとDictyonaryを比較すると、処理速度もDictyonaryの方が高速ですし、Dictyonaryよりメソッドが少ないというデメリットもあります。

ただし、Dictyonaryは「異なるデータ型」は格納できないため、扱うデータによってCollectionとDictyonaryをうまく使い分ける事が一番良いかと思います。

Dictionaryの使い方は「Excel VBA Dictionaryの使い方」です。

タイトルとURLをコピーしました