HOME > 即効テクニック > Excel VBA > その他関連のテクニック > コレクションの作成 (Collectionオブジェクト)

コレクションの作成 (Collectionオブジェクト)|Excel VBA

その他関連のテクニック

コレクションの作成 (Collectionオブジェクト)

(Excel 97/2000/2002/2003/2007/2010)

Collectionオブジェクトを使うと、文字列、数値、オブジェクトを要素とする独自のオブジェクトを作成できます。

●基本●

Dim colTest As Collection
Set colTest = New Collection
または
Dim colTest As New Collection
のように宣言をした後、Addメソッドでメンバーを追加します。
With colTest
    .Add Item:="アイテム1", Key:="i1"
    .Add Item:="アイテム2", Key:="i2"
    .Add Item:="アイテム3", Key:="i3"
    .Add Item:="アイテム4", Key:="i4"
    .Add Item:="アイテム5", Key:="i5"
End With

引数Keyは指定しなくてもかまいません。
また、引数Itemの値は重複可能なのに対し、引数Keyには重複する値を指定できないことに留意してください。

このようにして作成した独自コレクションにアクセスするには
colTest("i1") ⇒ "アイテム1"
colTest(3)   ⇒ "アイテム3"
のように、インデックス、もしくは"Key"を指定してアクセスすることができます。


●重要●

  1. Collectionに追加できるメンバーのデータ型は同じでなくてもよい。

  2. Keyによる識別が可能

2. については基本でも触れたとおりですが、例えば2次元配列に格納したデータと比較したとき、この意味がわかるのではないでしょうか。 例えば・・・

Dim MyVar As Variant
MyVar = Range("A1:B100").Value

このようなバリアント型配列があったとして、この配列の各要素にアクセスする方法は

MyVar(2,3)

のようにインデックスだけに限られますが、コレクションならKeyを指定してアクセスできるのです。

1.については、例えばユーザフォーム上に配置したコントロールをコレクションに追加することで、 ループ構造でのアクセスが容易になります。 以下は2.の特徴についてのサンプルです。

(前提):ユーザーフォーム上に次のコントロールが配置されている
コマンドボタン:2つ、オプションボタン:2つ、チェックボックス:1つ、テキストボックス:1つ、コンボボックス:1つ
※オブジェクト名は標準のまま

'=============================================================
'モジュールレベル変数
Private colTest As Collection

'=============================================================
'フォーム初期化イベント

Private Sub UserForm_Initialize()

    Dim k As Integer

    Set colTest = New Collection

    '作成したコレクションに要素を追加
    With colTest
        .Add TextBox1
        .Add ComboBox1, "MyCombo"
        .Add OptionButton1
        .Add OptionButton2
        .Add CheckBox1
        .Add "文字列"
        .Add 1000
    End With

    For k = 1 To 5
        'Keyを指定してコンボボックスにアクセスできることをテスト
        colTest("MyCombo").AddItem "アイテム" & k
    Next k

    CommandButton1.Caption = "転記"
    CommandButton2.Caption = "アイテム削除"

End Sub
'=============================================================
'セルへの転記

Private Sub CommandButton1_Click()

    Dim i As Integer

    For i = 1 To colTest.Count
        'インデックス指定によるコレクションへのアクセステスト
        '格納されている要素がコントロールの場合には既定値のValue
        'プロパティーの値がセルに書き込まれる
        ActiveSheet.Cells(1, i).Value = colTest(i)
    Next i
End Sub
'=============================================================
'Collectionに格納した要素の削除。Removeメソッドを使用

Private Sub CommandButton2_Click()

    Dim i As Integer

    For i = colTest.Count To 1 Step -1
        colTest.Remove i
    Next

    '削除の結果をメッセージボックスで確認
    MsgBox "colTest.Countの結果は: " & colTest.Count

End Sub