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 ・・・新着記事一覧を見る

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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