今回は「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の使い方」です。