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”は指定しなくてもよい
このようにして作成した独自コレクションにアクセスするには・・・
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)
のようにインデックスだけに限られます。
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
|