
エクセルバージョン
マイクロソフト365
本日はVBAのCollectionオブジェクトの追加,削除,取得,個数についてです。
それではいってみましょう!
Menu
Collectionオブジェクトの作成方法
参照設定は必要ありません。
1 2 3 4 5 6 7 8 9 | Sub collection_test1() '① Dim オブジェクト As New Collection '② Dim オブジェクト As Collection Set オブジェクト = New Collection End Sub |
Collectionオブジェクトのメンバー
ADDメソッド(追加)
概要
要素を追加します。
構文
object.Add item, key, beforeもしくはafter
引数
| Add | 必須/省略可 | 詳 細 |
item | 必須 | |
| key (第2引数) | 省略可 | インデックスまたはキーを指定。 ・既にキーが存在して重複する場合はエラーになります。 |
| before (第3引数) | 省略可 | 指定した要素の前に追加。 ・インデックスで指定。 (0からではなく1から) ・キーで指定も可。 ・beforeとafter両方指定は不可。 ・beforeとafter両方指定しない場合→末尾に追加。 |
| after (第3引数) | 省略可 | 指定した要素の後に追加。 ・インデックスで指定。 (0からではなく1から) ・キーで指定も可。 ・beforeとafter両方指定は不可。 ・beforeとafter両方指定しない場合→末尾に追加。 |
基本の追加
キーがあってもなくても追加は可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Sub 基本の追加() Dim cObj As New Collection Dim cObj2 As New Collection 'キーなしの場合 With cObj .Add "red" .Add "blue" .Add "yellow" End With 'キーありの場合 With cObj2 .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With End Sub |
【実行後】
キーが正しく追加されてるか確認したかったのですが、残念ながらエクセルVBAのウォッチウィンドウでは、キーは表示されず値しか表示できません。

先頭に追加
先頭に追加する場合
キー:黒
要素:black
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Sub 先頭に追加() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '第3引数before → 1 '先頭に追加 cObj.Add "black", "黒", 1 End Sub |
【追加前】

【追加後】

指定位置に追加
キーが青の後ろにblackを追加する場合
キー:黒
要素:black
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Sub 指定位置に追加() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '第4引数after → blue '指定位置に追加 cObj.Add "black", "黒", , "青" End Sub |
【追加前】

【追加後】

※指定位置に追加する方法は、配列に比べるとコレクションオブジェクトの方が簡単です\(^^)/
末尾に追加
末尾に追加は、第3引数を省略します。
キー:黒
要素:black
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 末尾に追加() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '末尾に追加 cObj.Add "black", "黒" End Sub |
【追加前】

【追加後】

重複するキーを追加
既にキーに存在する黄を追加するとエラーになるサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 重複するキーを追加() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '重複キーを追加(黄) cObj.Add "yel", "黄" '【結果】エラー End Sub |
【実行後】

※キーがエラーになることで重複データを削除の際に便利に機能し、このエラーを逆手にとってエクセルVBAの達人たちが、よく使用します。
異なるデータ型を追加
コレクションオブジェクトは異なるデータ型を追加できます。
1 2 3 4 5 6 7 8 9 10 | Sub 異なるデータ型() Dim cObj As New Collection With cObj .Add 1, "数字" .Add "あ", "文字" .Add #2/23/2022#, "日付" End With End Sub |
【追加後】

Itemメソッド(取得)
概要
要素を返します。
構文
object.Item(indexまたはkey)
または
object(indexまたはkey)
引数
| Item | 必須/省略可 | 詳 細 |
| index | 必須 | インデックスまたはキーを指定。 |
キーまたはインデックスを指定して取得
yellowを取得する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Sub 取得sample() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With 'yellowを取得する場合の4パターン Debug.Print cObj(3) 'item省略(インデックス) Debug.Print cObj("黄") 'item省略(キー) Debug.Print cObj.Item(3) 'item使用(インデックス) Debug.Print cObj.Item("黄") 'item使用(キー) End Sub |
【取得後】
Itemメソッドを省略しても取得は可能です。

全取得
For Eachを使用したサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub 全取得() Dim cObj As New Collection, element With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '要素を全取得 For Each element In cObj Debug.Print element Next End Sub |
【取得後】

Romoveメソッド(削除)
概要
要素を削除します。
構文
object.Remove (indexまたはkey)
引数
| Romove | 必須/省略可 | 詳細 |
| index | 必須 | インデックスまたはキーを指定。 |
先頭削除
インデックスを使用したサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 先頭削除() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '先頭削除 cObj.Remove (1) End Sub |
【削除前】

【削除後】

指定位置を削除
キーを指定してblueを削除するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 指定位置削除() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '指定位置削除(blue削除) cObj.Remove ("青") End Sub |
【削除前】

【削除後】

末尾削除
Countプロパティで最大インデックスの(末尾)要素を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 末尾削除() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '末尾削除 cObj.Remove (cObj.Count) End Sub |
【削除前】

【削除後】

全削除
For Next Stepキーワードを使用して、末尾の要素から削除するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Sub 全削除1() Dim cObj As New Collection Dim i As Integer With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '要素を全削除 For i = cObj.Count To 1 Step -1 cObj.Remove (i) Next End Sub |
もしくは
For Nextとインデックス(1)で、先頭の要素を繰り返し削除するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Sub 全削除2() Dim cObj As New Collection Dim i As Integer With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '要素を全削除 For i = 1 To cObj.Count cObj.Remove (1) Next End Sub |
【削除前】

【削除後】

Countプロパティ(個数)
概要
要素の個数を返します。
構文
object.Count
要素数を取得
Countプロパティ使用で、簡単に個数を取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub 要素数を取得() Dim cObj As New Collection With cObj .Add "red", "赤" .Add "blue", "青" .Add "yellow", "黄" End With '要素数を取得 Debug.Print cObj.Count '【結果】3 End Sub |
まとめ
似たようなもので配列やDictionaryオブジェクトがありますが、それぞれの特徴を生かした使用をすることで便利に機能する場合もあると思いますので、使用する機会があったら是非試してみてください(*゚▽゚)ノ
以上です。
