VBA入門
コレクションとは(Collection)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2023-07-18

第58回.コレクションとは(Collection)


同種のオブジェクトを複数まとめたものを「コレクション」と呼びます
ただしコレクションもオブジェクトの一種です。


例えば、
Workbookオブジェクトが複数まとまったものは「Workbooksコレクション」
Worksheetオブジェクトが複数まとまったものは「Worksheetsコレクション」
オブジェクト名が単数形であるのに対し、
コレクション名が複数形であることがポイントです。

多くの場合、○○○オブジェクトに対応する、○○○sコレクションがあります。
(ただし全てのオブジェクトにコレクションがあるわけではありません)
従って、Excelには、多くのコレクションがあります。


コレクションの中から単一オブジェクトを指定する場合

コレクション(複数オブジェクトの集まり)の中から単一オブジェクトを指定するには、

コレクション.Item(インデックス)
または、
コレクション.Item(オブジェクト名)

このように記述するのですが、
普通は、.Itemを省略して、

コレクション(インデックス)
または、
コレクション("オブジェクト名")

このように書くことが多いです。

具体的には、

Workbooks("Book1.xls")
Worksheets("Sheet1")
Worksheets(1)

等々になります。
この使い方は、既に何度も出てきたものですので、記述に違和感はないでしょう。


セルであるRangeオブジェクトのコレクションは?

セルであるRangeオブジェクトのコレクションは、どうなっているのでしょうか。
少なくとも、Rangesコレクションというものはありません。
Rangeコレクションという言い方も、普通はしません。

そもそも、セル(単一セル)のコレクションが、Rangeオブジェクトなのです。
つまり、単一セルを表すオブジェクトが存在していないのです。

Cellsが複数形で、Cellオブジェクトのコレクションのような感じを受けるにもかかわらず、
Cellオブジェクトなんて存在していない事が、余計に混乱を招いているのかもしれません。

Rangeオブジェクトだけが特別なものだと考えてください。
Rangeは、オブジェクトでもあり、コレクションでもあります


コレクションの要素数

コレクションの要素数、つまりコレクションに入っているオブジェクトの数を取得するには、
コレクション.Count
これで、コレクション内のオブジェクト数を取得できます。
つまり、

コレクション(1)
コレクション(2)
・・・
コレクション(コレクション.Count)

これらは単一のオブジェクトであり、その集合がコレクションとなっています。
コレクションは、コレクション.Count個のオブジェクトの集まりだという事です。

ワークシートの場合なら、
例えば、「Sheet1」「Sheet2」「Sheet3」の3つのシートがある場合
Worksheets.Count → 3
Worksheets(1) → Sheet1
Worksheets(2) → Sheet2
Worksheets(3) → Sheet3
と言う事になります。


Collectionオブジェクト

上記までのコレクションの説明は、VBAとしてのコレクションと言う用語の説明です。
VBAには、独自のコレクションを作成するためのオブジェクトが用意されています。
それがCollectionオブジェクトになります。

Collectionオブジェクトは、1つのオブジェクトとして参照できる複数の要素の集合です。
Collectionオブジェクを利用すると、互いに関連付けられた複数の要素を 1 つのオブジェクトとして参照できます。
つまり、
文字列、数値、オブジェクトを要素とした独自のコレクション(オブジェクト)を作成できるという事です。

コレクションのメンバーは、同じデータ型を共有する必要はありません。
つまり、データ型の違うデータを1つのコレクションに入れられるという事になります。
とはいえ実務において、関連性のないオブジェクトを1つのコレクションに入れるというのは少し無理がありますが。

Collection オブジェクトのプロパティ
Count コレクション内のオブジェクトの数を含む長整数型 (Long) の値を返します。
値の取得のみ可能です。

前述のコレクションの説明のとおりです。

Collection オブジェクトのメソッド
Add Collection オブジェクトにメンバを追加します。
Item 指定した位置または文字列に対応する特定の Collection オブジェクトのメンバを返します。
Remove Collection オブジェクトからメンバを削除します。

Addメソッド
object.Add item, key, before, after
Add メソッドの構文は、以下の名前付き引数で構成されています。

object 必ず指定します。
Collectionオブジェクトを指定します。
item 必ず指定します。
追加するメンバを表す式を指定します。
key 省略可能です。
各メンバの位置を表す数値の代わりに使用できる重複しない文字列を指定します。
before 省略可能です。
コレクションの中の相対的な位置を表す式を指定します。
追加対象のメンバは、このbeforeで指定したメンバの前に追加されます。
数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。
文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。
beforeとafterを同時に指定することはできません。
after 省略可能です。
コレクションの中の相対的な位置を表す式を指定します。
コレクション内のafterで指定したメンバの後ろに追加されます。
数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。
文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。
beforeとafterを同時に指定することはできません。

引数Itemの値は重複可能ですが、
引数Keyには重複する値を指定できずエラーとなります。
引数Keyは省略可能ですが、その場合は当然キーによる要素へのアクセスは出来なくなります。

Itemメソッド
指定した位置または文字列に対応する特定の Collectionオブジェクトのメンバを返します。
前述のコレクションの説明のとおりです。

Removeメソッド
Collectionオブジェクトからメンバを削除します。
object.Remove index

object 必ず指定します。
Collectionオブジェクトを指定します。
index 必ず指定します。
削除するメンバの位置を式で指定します。
数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。
文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。

作成したCollectionオブジェクトの使い方は、前述のVBA組み込みのコレクションと同様になります。

Collectionの使用例

Dim colls As New Collection
'または、以下のように、DimとSetを使う
'Dim colls As Collection
'Set colls = New Collection

With colls
  .Add Item:="アイテム1", Key:="key1"
  .Add Item:="アイテム2", Key:="key2"
  .Add Item:="アイテム3", Key:="key3"
  .Remove ("key3")
  .Add Item:="アイテム4", Key:="key4"
End With

MsgBox colls.Count '3と表示
MsgBox colls(1) 'アイテム1と表示
MsgBox colls.Item(2) 'アイテム2と表示
MsgBox colls.Item(3) 'アイテム4と表示
MsgBox colls("key4") 'アイテム4と表示

Collectionに対して以下のように処理すると、
後ろの要素に行くにしたがってより処理時間がかかってしまうようになります。

Dim i As Long
For i = 1 To colls.Count
  Debug.Print colls(i)
Next

コレクションに対して、インデックス指定してアクセスすると、後ろの要素に行くにしたがってとても遅くなります。
これは、コレクションのメモリ構造がチェーンのように次々につながっている事に起因します。
コレクション対して全件処理する場合は、次回説明するFor Eachを使って以下のように処理してください。

Dim v As Variant
For Each v In colls
  Debug.Print v
Next




同じテーマ「マクロVBA入門」の記事

第55回.Worksheetオブジェクト
第56回.Rangeオブジェクト(RangeとCells)
第57回.Applicationのプロパティ(マクロ高速化と警告停止等)
第58回.コレクションとは(Collection)
第59回.コレクション処理(For Each)
第60回.エラー処理(On Error)
第61回.「On Error GoTo」と「Exit Sub」
第62回.「On Error Resume Next」とErrオブジェクト
第63回.ブックを開く(Open,Add)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)


新着記事NEW ・・・新着記事一覧を見る

シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ