【VBA入門】Collectionオブジェクトの使い方

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

実行結果:
collection_count

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_item

このサンプルコードでは、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_ForEach

このサンプルコードでは、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

このサンプルコードでは、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_remove

このサンプルコードでは、CollectionオブジェクトmyColの要素をRemoveメソッドを使って削除しています。出力結果を確認すると項目”Tokyo”が削除されていることがわかります。

なお、Removeメソッドを削除する前に前章でご紹介した自作の関数isExistsを使って削除する項目が存在するかチェックしています。

まとめ

ここではCollectionオブジェクトについて説明しました。

Collectionはキーと項目をセットで扱うことができて、さらにデータ型が異なってもまとめて扱うことができるので便利です。

キーと項目をセットで扱えるのでDictionaryの代わりにもなりますが、使えるメソッドが少なかったり、処理が遅くなるなどのデメリットもありますので、用途によって使い分けることをオススメします。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次