はじめに
VBAで複数のデータを扱う際、配列は非常に便利ですが、「処理の途中で要素の数を変えたい」場合には、動的配列と ReDim Preserve
を使う必要があり、少し手間がかかります。
もっと手軽に、要素の追加や削除を自由に行いたい場合に最適なのが「Collection
」オブジェクトです。Collection
は、可変長のリストを管理するためのVBAの組み込みオブジェクトで、まるで買い物かごに商品を入れたり出したりするように、直感的にデータを扱うことができます。
この記事では、Collection
の基本的な使い方(作成、追加、削除、参照)を、具体的なサンプルコードと共に解説します。
Collection
オブジェクトの基本的な使い方
このマクロは、Collection
オブジェクトを作成し、いくつかの項目を追加した後、一つを削除し、最終的なリストの内容をセルに書き出します。
完成コード
' Collectionオブジェクトの基本的な使い方
Sub BasicCollectionExample()
'--- 1. Collectionオブジェクトの作成 ---
Dim itemList As Collection
Set itemList = New Collection
'--- 2. .Addメソッドで項目を追加 ---
itemList.Add "ノートPC"
itemList.Add "キーボード"
itemList.Add "マウス"
itemList.Add "モニター"
'--- 3. .Countプロパティで項目数を取得 ---
Debug.Print "追加後の項目数: " & itemList.Count ' -> 4
'--- 4. .Removeメソッドで項目を削除 ---
' インデックス番号(1始まり)で3番目の「マウス」を削除
itemList.Remove 3
Debug.Print "削除後の項目数: " & itemList.Count ' -> 3
'--- 5. ループで全項目を参照し、セルに書き出す ---
Dim i As Long
For i = 1 To itemList.Count
' .Item(i) または itemList(i) で各項目にアクセス
Worksheets("Sheet1").Range("B2").Offset(i - 1, 0).Value = itemList(i)
Next i
End Sub
コードの解説
1. Collection
の作成
Set itemList = New Collection
Collection
はオブジェクトなので、Dim
で宣言した後、Set
とNew
キーワードを使って新しいインスタンス(実体)を作成する必要があります。
2. 項目の追加 (.Add
)
itemList.Add "ノートPC"
.Add
メソッドを使って、Collection
に項目を追加します。追加された項目には、自動的に 1
から始まるインデックス番号が割り振られます。
3. 項目数の取得 (.Count
)
itemList.Count
.Count
プロパティは、Collection
に現在含まれている項目の総数を返します。読み取り専用です。
4. 項目の削除 (.Remove
)
itemList.Remove 3
.Remove
メソッドは、指定したインデックス番号(1始まり)の項目を削除します。項目が削除されると、それ以降の項目のインデックスは自動的に前に詰められます。
5. 項目の参照 (.Item
または ()
)
itemList(i)
Collection
の各項目には、.Item(インデックス番号)
または (インデックス番号)
でアクセスできます。インデックスは 1始まりです。For i = 1 To itemList.Count
のように、1
から .Count
までループさせるのが定石です。
配列との違い
Collection
は配列とよく似ていますが、以下のような違いがあります。
項目 | Collection | 配列 (Array ) |
サイズ変更 | 不要(自動で伸縮) | ReDim Preserve が必要 |
要素の型 | Variant のみ(何でも入る) | 宣言時に指定可能 |
インデックス | 1始まり(固定) | 0始まり/1始まりなど自由に設定可 |
キーの設定 | 可能 (Add Item, Key ) | 不可 |
まとめ
今回は、VBAの Collection
オブジェクトを使って、柔軟なリストを扱う方法を解説しました。
New Collection
で作成する。.Add
で項目を追加し、.Remove
で削除する。.Count
で項目数を取得し、(インデックス)
で項目にアクセスする。- インデックスは常に
1
始まり。
要素の数が事前に分からない場合や、処理の途中で頻繁に追加・削除が発生するような場面では、配列よりも Collection
を使う方が、コードがシンプルになり、はるかに便利です。