【ExcelVBA・マクロ】Collectionオブジェクトの使い方|Dictionaryとの違いも解説【コピペOK】

ExcelVBA

Collectionオブジェクトとは

Collectionオブジェクトは、複数のデータをひとまとめにして管理できるVBA標準のオブジェクトです。配列と似ていますが、要素数をあらかじめ決めておく必要がなく、Addメソッドで自由に要素を追加したり、Removeメソッドで途中の要素を削除したりできる柔軟さが特徴です。

似たようなオブジェクトにDictionaryがありますが、Collectionは参照設定もCreateObjectも不要で、VBA標準機能としてすぐに使えるのが大きなメリットです。この記事では、Collectionオブジェクトの基本操作から、Dictionaryとの違い、実務での活用例までを解説します。

スポンサーリンク
スポンサーリンク

基本構文

Collectionオブジェクトには、主に以下の4つの操作があります。

メソッド/プロパティ 説明
Add 要素を追加する
Item 指定した位置(またはキー)の要素を取得する
Remove 指定した位置(またはキー)の要素を削除する
Count 格納されている要素数を取得する

要素を追加する(Add)

Sub CollectionAddSample()
    Dim col As New Collection

    col.Add "田中"
    col.Add "佐藤"
    col.Add "鈴木"

    Debug.Print col.Count '→ 3
End Sub

New Collectionでオブジェクトを生成し、Addメソッドで要素を追加していくだけのシンプルな書き方です。

要素を取得する(Item)

Collectionの要素は1から始まるインデックスで管理されます。配列のように0からではない点に注意してください。

Sub CollectionItemSample()
    Dim col As New Collection
    col.Add "田中"
    col.Add "佐藤"
    col.Add "鈴木"

    Debug.Print col.Item(1) '→ 田中
    Debug.Print col(2)      '→ 佐藤(Itemは省略可能)
End Sub

Itemは既定メンバーのため、col(2)のように省略して書くこともできます。

要素を削除する(Remove)

Sub CollectionRemoveSample()
    Dim col As New Collection
    col.Add "田中"
    col.Add "佐藤"
    col.Add "鈴木"

    col.Remove 2 '2番目(佐藤)を削除

    Dim i As Long
    For i = 1 To col.Count
        Debug.Print col(i)
    Next i
    '→ 田中, 鈴木 の順で表示される
End Sub

要素を削除すると、後ろの要素のインデックスが自動的に1つずつ繰り上がります。

キーを指定して管理する

CollectionのAddメソッドには、第2引数として「キー」を指定できます。キーを指定しておくと、インデックス番号がわからなくても、キー文字列で要素を取得できます。

Sub CollectionKeySample()
    Dim col As New Collection

    col.Add "営業部", "田中"
    col.Add "経理部", "佐藤"
    col.Add "総務部", "鈴木"

    Debug.Print col.Item("経理部") '→ 佐藤
    Debug.Print col("総務部")      '→ 鈴木
End Sub

Add "値", "キー"という順番で指定する点に注意してください。キーを使うことで、Dictionaryに近い感覚で「名前で引く」データ管理ができます。

For Eachで全要素をループする

Collectionの全要素を順番に処理したい場合は、For Eachを使うのが基本です。

Sub CollectionForEachSample()
    Dim col As New Collection
    Dim item As Variant

    col.Add "田中"
    col.Add "佐藤"
    col.Add "鈴木"

    For Each item In col
        Debug.Print item
    Next item
End Sub

Dictionaryオブジェクトとの違い

CollectionとDictionaryはどちらも「複数のデータをまとめて管理する」点で似ていますが、以下のような違いがあります。

Collection Dictionary
事前準備 不要(VBA標準) 参照設定またはCreateObjectが必要
キーの重複チェック 重複するキーを追加するとエラーになる Existsメソッドで事前にチェックできる
キーの一覧取得 できない Keysメソッドで一括取得できる
要素の削除 インデックスまたはキーで削除可能 キーで削除可能(Remove
用途 シンプルな一覧管理 キーによる検索・存在確認を多用する処理

キーの存在確認をしながら処理を進めたい場合や、キー一覧を扱いたい場合はDictionaryの方が適しています。逆に「順番に並んだデータをシンプルに管理したいだけ」という場面では、追加の設定が不要なCollectionの方が手軽です。

実践例:部署ごとの担当者リストを重複なく管理する

キーの重複チェックを利用して、同じ部署名を二重登録しないようにする例です。Collectionは同じキーをAddしようとするとエラーが発生するため、On Errorと組み合わせて重複チェックに使えます。

Sub AddDepartmentUnique()
    Dim col As New Collection
    Dim departments As Variant
    Dim i As Long

    departments = Array("営業部", "経理部", "営業部", "総務部")

    For i = 0 To UBound(departments)
        On Error Resume Next
        col.Add departments(i), departments(i)
        On Error GoTo 0
    Next i

    Dim d As Variant
    For Each d In col
        Debug.Print d
    Next d
    '→ 営業部, 経理部, 総務部 の3件のみ表示される(重複は無視)
End Sub

同じキーでAddしようとするとエラーが発生する仕組みを逆手に取ることで、重複データを簡単に除外できます。

注意点

  • インデックスは1から始まります。配列(0始まり)と混同しないように注意してください。
  • 同じキーを2回Addしようとすると実行時エラーになります。重複を許容したくない場面ではこの性質を活用できますが、意図せず重複データを扱う処理では事前にOn Errorなどで対処が必要です。
  • Dictionaryのように「キーが存在するかどうか」を事前に判定するメソッドはありません。存在確認をしたい場合は、On Error Resume Nextでエラーを回避するか、Dictionaryオブジェクトの利用を検討してください。

まとめ

Collectionオブジェクトは、参照設定不要ですぐに使える手軽さが魅力の、複数データをまとめて管理するための標準オブジェクトです。インデックスによる取得だけでなく、キーを指定した管理にも対応しており、シンプルな一覧処理であれば十分に活用できます。キーの存在確認や一覧取得など、より高度な検索処理が必要になった場合は、Dictionaryオブジェクトへの切り替えも検討してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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