第58回.コレクションとは(Collection)
同種のオブジェクトを複数まとめたものを「コレクション」と呼びます、
コレクションもオブジェクトの一種です。
例えば、
Workbookオブジェクトが複数まとまったものは「Workbooksコレクション」
Worksheetオブジェクトが複数まとまったものは「Worksheetsコレクション」
オブジェクト名が単数形であるのに対し、
コレクション名が複数形であることがポイントです。
(全てのオブジェクトにコレクションがあるわけではありません)
従って、Excelには、多くのコレクションがあります。
コレクションの中から単一オブジェクトを指定する場合
コレクション.Item(インデックス)
または、
コレクション.Item(オブジェクト名)
このように記述するのですが、
普通は、.Itemを省略して、
コレクション(インデックス)
または、
コレクション("オブジェクト名")
このように書くことが多いです。
Workbooks("Book1.xls")
Worksheets("Sheet1")
Worksheets(1)
等々になります。
この使い方は、既に何度も出てきたものですので、記述に違和感はないでしょう。
セルであるRangeオブジェクトのコレクションは?
少なくとも、
Rangeコレクションという言い方も、普通はしません。
そもそも、セル(単一セル)のコレクションが、Rangeオブジェクトなのです。
つまり、単一セルを表すオブジェクトが存在していないのです。
Cellオブジェクトなんて存在していない事が、余計に混乱を招いているのかもしれません。
Rangeは、オブジェクトでもあり、コレクションでもあります。
コレクションの要素数
コレクション.Count
これで、コレクション内のオブジェクト数を取得できます。
つまり、
コレクション(1)
コレクション(2)
・・・
コレクション(コレクション.Count)
これらは単一のオブジェクトであり、その集合がコレクションとなっています。
コレクションは、コレクション.Count個のオブジェクトの集まりだという事です。
例えば、「Sheet1」「Sheet2」「Sheet3」の3つのシートがある場合
Worksheets.Count → 3
Worksheets(1) → Sheet1
Worksheets(2) → Sheet2
Worksheets(3) → Sheet3
と言う事になります。
Collectionオブジェクト
VBAには、独自のコレクションを作成するためのオブジェクトが用意されています。
それがCollectionオブジェクトになります。
Collectionオブジェクを利用すると、互いに関連付けられた複数の要素を 1 つのオブジェクトとして参照できます。
つまり、
文字列、数値、オブジェクトを要素とした独自のコレクション(オブジェクト)を作成できるという事です。
つまり、データ型の違うデータを1つのコレクションに入れられるという事になります。
とはいえ実務において、関連性のないオブジェクトを1つのコレクションに入れるというのは少し無理がありますが。
Count
コレクション内のオブジェクトの数を含む長整数型 (Long) の値を返します。
値の取得のみ可能です。
Add | Collection オブジェクトにメンバを追加します。 |
Item | 指定した位置または文字列に対応する特定の Collection オブジェクトのメンバを返します。 |
Remove | Collection オブジェクトからメンバを削除します。 |
Addメソッド
Add メソッドの構文は、次の対象となるオブジェクトと名前付き引数から構成されます。
object | 必ず指定します。 Collectionオブジェクトを指定します。 |
item | 必ず指定します。 追加するメンバを表す式を指定します。 |
key | 省略可能です。 各メンバの位置を表す数値の代わりに使用できる重複しない文字列を指定します。 |
before | 省略可能です。 コレクションの中の相対的な位置を表す式を指定します。 追加対象のメンバは、このbeforeで指定したメンバの前に追加されます。 数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。 文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。 beforeとafterを同時に指定することはできません。 |
after | 省略可能です。 コレクションの中の相対的な位置を表す式を指定します。 コレクション内のafterで指定したメンバの後ろに追加されます。 数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。 文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。 beforeとafterを同時に指定することはできません。 |
引数Itemの値は重複可能ですが、
引数Keyには重複する値を指定できずエラーとなります。
引数Keyは省略可能ですが、その場合は当然キーによる要素へのアクセスは出来なくなります。
Itemメソッド
前述のコレクションの説明のとおりです。
Removeメソッド
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と表示
後ろの要素に行くにしたがってより処理時間がかかってしまうようになります。
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,Add)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)
新着記事NEW ・・・新着記事一覧を見る
トランザクション処理|SQL入門(12月11日)
インデックスを作成して高速化(CREATE INDEX)|SQL入門(12月9日)
他のテーブルのデータで追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。