Collection(コレクション)って使ってますか?Collectionはキーと項目のセットを要素として格納することができます。
しかも、それぞれの要素でデータ型が違っていても問題がないので便利です。
この記事では、Collection(コレクション)について
- Collectionオブジェクトとは
- Collectionの使い方
といった基本的な内容から、
- For Each文で要素一覧を取得する方法
- 要素の存在チェックをする方法
- Removeで要素を削除する方法
など具体的な使い方についても解説していきます。
今回はCollection(コレクション)について、使い方をわかりやすく解説します。
Collectionオブジェクトとは
Collectionオブジェクトとは項目(item)とキー(key)をセットで格納するオブジェクトのことです。Collectionオブジェクトの要素には数値、文字列からオブジェクトまで格納することができます。
また、要素ごとに数値や文字列などデータ型が異なる場合でも一つのコレクションとしてまとめておくことができます。
ただし、キーを重複させることはできません。同じように項目とキーをセットで格納できるオブジェクトとしてDictionaryオブジェクトがあります。
Collectionオブジェクトと違って、Dictionaryオブジェクトは異なるデータ型を要素として格納することはできません。
またCollectionオブジェクトはDictionaryオブジェクトの代わりとして使用することもできますが、用意されているメソッドが少なかったり、一般的に処理速度がDictionaryオブジェクトに比べて若干遅いなどのデメリットもあります。
Collectionの使い方
それではCollectionオブジェクトの使い方についてみていきましょう!
プロパティ、メソッド一覧
これから使用するCollectionオブジェクトのプロパティとメソッドについて表にまとめました。
プロパティ:
プロパティ | 説明 |
---|---|
Count | 格納された要素の数 |
メソッド:
メソッド | 説明 |
---|---|
Add item, key, index1, index2 | キーに項目を関連付けて追加 index1またはindex2でインデックス番号の指定可 |
Remove key|index | キーと項目のペアを削除 |
Item(key|index) | キーまたはインデックス番号に関連付けられた項目 |
宣言する方法
Collectionオブジェクトは以下のように宣言します。
Dim コレクション名 As Collection Set コレクション名 = New Collection
また、以下のように宣言することもできます。
Dim コレクション名 As New Collection
Addで初期化、追加する方法
Collectionオブジェクトを初期化、または要素を追加するにはAddメソッドを使用します。Addメソッドの第1引数に項目、第2引数にキー、第3引数、第4引数にはインデックス番号を指定します。
第3引数で指定したインデックス番号の前に要素を追加することになります。第4引数で指定したインデックス番号の後に要素を追加することになります。
第2引数以降は省略可能です。キーの指定を省略した場合はインデックス番号を使って項目を参照することになります。
それではサンプルコードで確認していきましょう。
Sub macro1() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With End Sub
このサンプルコードでは、CollectionオブジェクトmyColを宣言し、Addメソッドを使って要素を追加しています。
項目にはString型とInteger型のように異なるデータ型を格納できていることがわかります。
Countで要素数を調べる方法
Collectionオブジェクトの要素数を調べるにはCountプロパティを使用します。
サンプルコードで確認していきましょう。
Sub macro2() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With '要素数の出力表示 MsgBox "要素数: " & myCol.Count, vbInformation End Sub
実行結果:
keyでitemを取得する方法
Collectionオブジェクトのitemを取得するにはItemメソッドを使用します。keyを使って指定する方法とインデックス番号を使って指定する方法があります。
なお、Itemの記述は省略することもできます。
サンプルコードで確認していきましょう。
Sub macro3() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With '項目の出力表示 MsgBox myCol.Item("First Name") & vbCrLf & _ myCol("First Name") & vbCrLf & _ myCol(2), vbInformation End Sub
実行結果:
このサンプルコードでは、CollectionオブジェクトmyColの要素の項目をItemメソッドを使って出力表示しています。
Itemメソッドの引数にkeyを指定した場合とインデックス番号を指定した場合、またItemメソッドの記述を省略した場合で同じ結果を出力表示しています。
For Each文で要素一覧を取得する方法
Collectionオブジェクトの要素をすべて取得する場合はFor Each文を使うと便利です。
For Each文ではInでCollectionオブジェクトの項目を取得することができます。取得した項目はバリアント型になります。
サンプルコードで確認していきましょう。
Sub macro4() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With '項目の出力表示 Dim str As String, i As Integer For Each Var In myCol i = i + 1 str = str & i & " : " & Var & vbCrLf Next Var MsgBox str, vbInformation End Sub
実行結果:
このサンプルコードでは、CollectionオブジェクトmyColの要素をFor Each文を使って1つずつ取得しています。
要素の存在チェックをする方法
Collectionオブジェクトの要素を削除する場合などは、対象の要素が存在するかチェックしてから削除する方がエラーが発生せずにすみます。
VBAではCollectionオブジェクトの要素が存在するかチェックするメソッドは用意されていません。ちなみにVisual BasicではContainsメソッドが用意されているのですが、VBAでは用意されていません。
ですので、自分で関数を作成する必要があります。要素の存在をチェックするサンプルコードをご紹介します。
Sub macro6() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With '項目の存在チェック MsgBox isExists(myCol, "Tokyo"), vbInformation End Sub Function isExists(col As Collection, item As Variant) As Boolean For Each Var In col If Var = item Then isExists = True Exit Function End If Next Var isExists = False End Function
実行結果:
このサンプルコードでは、Collectionオブジェクトで対象の要素が存在するかチェックする関数としてisExistsを宣言、定義しています。
isExistsは引数にCollectionオブジェクトと項目を指定し、その項目が存在すればTrueを存在しなければFalseを返します。
“Tokyo”は項目として存在していますので、Trueを返しています。
Removeで要素を削除する方法
Collectionオブジェクトの要素を削除するには、Removeメソッドを使用します。
Removeメソッドは引数で対象のキーもしくはインデックス番号を指定します。サンプルコードで確認していきましょう。
Function isExists(col As Collection, item As Variant) As Boolean For Each Var In col If Var = item Then isExists = True Exit Function End If Next Var isExists = False End Function Sub macro7() 'Collectionオブジェクトの宣言 Dim myCol As Collection Set myCol = New Collection '要素の追加(初期化) With myCol .Add "Taro", "Last Name" .Add "Yamada", "First Name" .Add "Tokyo", "Address" .Add 20, "Age" End With '要素の削除 If isExists(myCol, "Tokyo") Then '存在するか確認 myCol.Remove "Address" Else MsgBox "削除できません", vbInformation End If '項目の出力表示 Dim str As String, i As Integer For Each Var In myCol i = i + 1 str = str & i & " : " & Var & vbCrLf Next Var MsgBox str, vbInformation End Sub
実行結果:
このサンプルコードでは、CollectionオブジェクトmyColの要素をRemoveメソッドを使って削除しています。出力結果を確認すると項目”Tokyo”が削除されていることがわかります。
なお、Removeメソッドを削除する前に前章でご紹介した自作の関数isExistsを使って削除する項目が存在するかチェックしています。
まとめ
ここではCollectionオブジェクトについて説明しました。
Collectionはキーと項目をセットで扱うことができて、さらにデータ型が異なってもまとめて扱うことができるので便利です。
キーと項目をセットで扱えるのでDictionaryの代わりにもなりますが、使えるメソッドが少なかったり、処理が遅くなるなどのデメリットもありますので、用途によって使い分けることをオススメします。
使いこなすことができるように、この記事を何度も参考にして下さいね!