見出し画像

VBA|データ構造|Collection(コレクション)|可変長の要素集合を Add / Item / Remove / Count で扱う(キー指定も可)


基本構文

(実務テンプレ:作成)

Dim col As Collection : Set col = New Collection

(実務テンプレ:追加)
・ col.Add Item:= {値またはObject}, [Key:= {キー文字列}], [Before:= {位置 or キー}], [After:= {位置 or キー}]
 ○ Item(アイテム):追加する値(String/Long/Variant など)または Object 参照
 ○ Key(キー):任意の識別子(文字列)。指定すると col("キー") で取得できる
 ○ Before(ビフォア):指定位置(1始まり)またはキーの“前”に挿入
 ○ After(アフター):指定位置(1始まり)またはキーの“後”に挿入

(実務テンプレ:取得)
・ v = col( {1始まりIndex} ) または v = col.Item( {1始まりIndex} )
・ v = col( "Key文字列" ) でキー取得
・ Object を取り出すときは Set obj = col(...)

(実務テンプレ:削除)
・ col.Remove {1始まりIndex または "Key文字列"}

(実務テンプレ:件数)
・ n = col.Count

(戻り値の型・性質)
・ Add:戻り値なし(Collection に要素を追加するだけ)
・ Item(既定メンバー):Variant(中身が値なら値、Objectなら参照)
・ Remove:戻り値なし(要素を削除し、後続Indexは詰まる)
・ Count:Long(要素数)


サンプルコード

サンプル①:基本(追加→列挙→Count)
役割:Collection を「可変長の箱」として使う最小例
理由:配列より手軽に追加でき、For Each で回せる
注意:Index は 1 始まりなので col(0) はエラーになりやすい

Option Explicit
Sub Sample_Collection_Basic()
    Dim col As Collection: Set col = New Collection
    
    col.Add "Apple"
    col.Add "Banana"
    col.Add "Cherry"
    
    Dim v As Variant
    For Each v In col
        Debug.Print v
    Next
    
    Debug.Print "Count=" & col.Count
End Sub

出力:
Apple / Banana / Cherry / Count=3

サンプル②:Key で追加・取得(存在チェックは On Error で代用)
役割:キーで“辞書っぽく”引ける形にする
理由:位置ではなく意味(Key)で参照でき、読みやすくなる
注意:Collection は Exists が無いので、存在確認はエラー制御か全探索になる

Option Explicit
Sub Sample_Collection_KeyGet()
    Dim col As Collection: Set col = New Collection
    
    col.Add "Tokyo", "JPN"
    col.Add "NewYork", "USA"
    
    Debug.Print col("JPN")
    Debug.Print GetIfExists(col, "FRA", "(not found)")
End Sub

Private Function GetIfExists(ByVal col As Collection, ByVal key As String, ByVal fallback As String) As String
    On Error GoTo NotFound
    GetIfExists = CStr(col(key))
    Exit Function
NotFound:
    GetIfExists = fallback
End Function

出力:
Tokyo / (not found)

サンプル③:Before/After で挿入+Remove で削除(Indexが詰まる確認)
役割:順序を制御しながら追加・削除する
理由:途中挿入や削除が配列より楽(ReDim不要)
注意:Remove 後は後続の Index が 1 つ前に詰まる(保持しているIndexはズレる)

Option Explicit
Sub Sample_Collection_InsertRemove()
    Dim col As Collection: Set col = New Collection
    
    col.Add "A"
    col.Add "C"
    col.Add "B", Before:=2   ' 2番目の前にBを入れて A,B,C にする
    
    Debug.Print col(1), col(2), col(3)
    
    col.Remove 2             ' Bを削除 → A,C に詰まる
    Debug.Print col(1), col(2)
End Sub

出力:
A B C / A C


備考

・ Key は大文字小文字を区別しないため、"ABC" と "abc" を別キーとして共存させられない。
・ Key は読み取り用に取り出せず、Key 一覧の取得や Key の列挙ができない(必要なら Dictionary を検討)。
・ Key 重複や存在しない Key / Index 参照は実行時エラーになりやすいので、運用側で「追加前に存在チェック」または「追加は必ずユニークKey」などのルール化が安全。
・ Object を格納する用途でも使えるが、取り出し側は Set を忘れると壊れる(値型とObjectが混在しやすい点に注意)。
・ Office の Workbooks や Worksheets なども「コレクション」で、Item(既定)と Count を持ち、Workbooks(1) のように 1 始まりで参照する設計が多い。

いいなと思ったら応援しよう!

Parusの寺小屋 技術メモや学習の整理として書いています。 もし内容が役に立ったり、続きを読みたいと思っていただけたら、 応援として受け取らせてもらえたら嬉しいです。