ExcelマクロVBA入門
第58回.コレクションとは(Collection)

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2019-07-20

第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オブジェクトの使い方は、前述のコレクションと同様になります。

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(1)
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)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)


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

Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



  • >
  • >
  • >
  • コレクションとは(Collection)

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


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




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