サーチ…
備考
Collection
は、VBAランタイムに含まれるコンテナオブジェクトです。それを使用するために追加の参照は必要ありません。 Collection
は、任意のデータ型の項目を格納するために使用でき、項目の順序インデックスまたはオプションの一意のキーを使用して検索することができます。
配列と辞書との機能比較
コレクション | アレイ | 辞書 | |
---|---|---|---|
サイズ変更可能 | はい | 時には1 | はい |
アイテムが注文される | はい | はい | はい2 |
アイテムは強く型付けされています | いいえ | はい | いいえ |
アイテムは序数で取り出すことができます | はい | はい | いいえ |
新しいアイテムを序数に挿入できます | はい | いいえ | いいえ |
アイテムが存在するかどうかを判断する方法 | すべてのアイテムを反復する | すべてのアイテムを反復する | すべてのアイテムを反復する |
アイテムはキーで取り出すことができます | はい | いいえ | はい |
キーは大文字と小文字を区別します | いいえ | N / A | オプション3 |
キーが存在するかどうかを判断する方法 | エラーハンドラ | N / A | .Exists 関数 |
すべてのアイテムを削除 | 反復処理と.Remove | Erase 、 ReDim | .RemoveAll 関数 |
1動的配列のみのサイズ変更が可能で、多次元配列の最後の次元のみがサイズ変更可能です。
2基礎となる.Keys
と.Items
が注文されます。
3 .CompareMode
プロパティによって.CompareMode
ます。
コレクションにアイテムを追加する
アイテムは、 .Add
メソッドを呼び出すことによってCollection
追加されます。
構文:
.Add(item, [key], [before, after])
パラメータ | 説明 |
---|---|
項目 | Collection に格納するアイテム。これは基本的に、プリミティブ型、配列、オブジェクト、およびNothing を含む、変数を割り当てることができる任意の値になります。 |
キー | オプション。 Collection からアイテムを取得するための一意の識別子として機能するString です。指定されたキーがCollection 既に存在する場合、「このキーは既にこのコレクションの要素に関連付けられています」という実行時エラー457が発生します。 |
前 | オプション。アイテムをCollection に挿入するための既存のキー( String 値) またはインデックス(数値)。値が指定されている場合、 afterパラメーターは空であるか、実行時エラー5です。「無効なプロシージャー呼び出しまたは引き数」が発生します。 Collection に存在しないString キーが渡されると、実行時エラー5:「無効なプロシージャ呼び出しまたは引数」が発生します。 Collection に存在しない数値インデックスが渡された場合、実行時エラー9: "下付き文字が範囲外です"が発生します。 |
後 | オプション。 Collection 後にアイテムを挿入する既存のキー( String 値) またはインデックス(数値)。値を指定した場合、 beforeパラメーターは空でなければなりません。発生したエラーはbeforeパラメーターと同じです。 |
ノート:
キーでは大文字と小文字は区別されません 。
.Add "Bar", "Foo"
、.Add "Baz", "foo"
を.Add "Baz", "foo"
と.Add "Baz", "foo"
はキー衝突になります。オプションのbeforeまたはafterパラメータのどちらも指定されていない場合、その項目は
Collection
最後の項目の後に追加されCollection
。beforeまたはafterパラメータを指定して挿入すると、既存のメンバーの数値インデックスが新しい位置に一致するように変更されます。これは、数値索引を使用してループ内に挿入を行うときには注意が必要であることを意味します。
使用例:
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One" 'No key. This item can only be retrieved by index.
.Add "Two", "Second" 'Key given. Can be retrieved by key or index.
.Add "Three", , 1 'Inserted at the start of the collection.
.Add "Four", , , 1 'Inserted at index 2.
End With
Dim member As Variant
For Each member In foo
Debug.Print member 'Prints "Three, Four, One, Two"
Next
End Sub
コレクションからアイテムを削除する
アイテムは、 .Remove
メソッドを呼び出すことによってCollection
から削除されます.Remove
構文:
.Remove(index)
パラメータ | 説明 |
---|---|
索引 | Collection から削除する項目。渡された値が数値型または数値のサブタイプを持つVariant 場合、数値インデックスとして解釈されます。渡された値が文字列を含むString またはVariant 場合、それはaキーとして解釈されます。 Collection に存在しないStringキーが渡されると、実行時エラー5:「無効なプロシージャ呼び出しまたは引数」が発生します。 Collection に存在しない数値インデックスが渡された場合、実行時エラー9: "下付き文字が範囲外です"が発生します。 |
ノート:
- 項目を削除する
Collection
で、それの後にすべての項目の数値インデックスを変更しますCollection
。For
、数値インデックスを使用して逆方向に実行する必要がある項目を削除するループ(Step -1
)添字の例外を防ぎ、アイテムをスキップします。 - アイテムは通常、
For Each
ループの内部からCollection
から削除する必要はありません 。これにより、予期しない結果が生じる可能性があります。
使用例:
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two", "Second"
.Add "Three"
.Add "Four"
End With
foo.Remove 1 'Removes the first item.
foo.Remove "Second" 'Removes the item with key "Second".
foo.Remove foo.Count 'Removes the last item.
Dim member As Variant
For Each member In foo
Debug.Print member 'Prints "Three"
Next
End Sub
コレクションのアイテム数の取得
Collection
内のアイテムの数は、その.Count
関数を呼び出すことで取得できます。
構文:
.Count()
使用例:
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
.Add "Four"
End With
Debug.Print foo.Count 'Prints 4
End Sub
コレクションからアイテムを取得する
アイテムは、 .Item
関数を呼び出すことでCollection
から取得できます。
構文:
.Item(index)
パラメータ | 説明 |
---|---|
索引 | Collection から取得する項目。渡された値が数値型または数値のサブタイプを持つVariant 場合、数値インデックスとして解釈されます。渡された値が文字列を含むString またはVariant 場合、それはaキーとして解釈されます。 Collection に存在しないStringキーが渡されると、実行時エラー5:「無効なプロシージャ呼び出しまたは引数」が発生します。 Collection に存在しない数値インデックスが渡された場合、実行時エラー9: "下付き文字が範囲外です"が発生します。 |
ノート:
-
.Item
はCollection
のデフォルトメンバーです。これにより、以下のサンプル使用法で示すように、構文の柔軟性が可能になります。 - 数値インデックスは1から始まります。
- キーでは大文字と小文字は区別されません 。
.Item("Foo")
と.Item("foo")
は同じキーを参照します。 - indexパラメータは、
String
からの数値に暗黙的にキャストされたり、その逆の場合には暗黙的にキャストされません 。.Item(1)
と.Item("1")
はCollection
異なる項目を参照することは完全に可能です。
使用例(インデックス):
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
.Add "Four"
End With
Dim index As Long
For index = 1 To foo.Count
Debug.Print foo.Item(index) 'Prints One, Two, Three, Four
Next
End Sub
使用例(鍵)の例:
Public Sub Example()
Dim keys() As String
keys = Split("Foo,Bar,Baz", ",")
Dim values() As String
values = Split("One,Two,Three", ",")
Dim foo As New Collection
Dim index As Long
For index = LBound(values) To UBound(values)
foo.Add values(index), keys(index)
Next
Debug.Print foo.Item("Bar") 'Prints "Two"
End Sub
使用例(代替構文):
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One", "Foo"
.Add "Two", "Bar"
.Add "Three", "Baz"
End With
'All lines below print "Two"
Debug.Print foo.Item("Bar") 'Explicit call syntax.
Debug.Print foo("Bar") 'Default member call syntax.
Debug.Print foo!Bar 'Bang syntax.
End Sub
.Item
はデフォルトのメンバーであり、単一のString
引数を取ることができるので、bang( !
)構文は許可されています。この構文の有用性は疑わしい。
コレクションでキーまたはアイテムが存在するかどうかを判断する
キー
Scripting.Dictionaryとは異なり、 Collection
は、指定されたキーが存在するかどうか、 または Collection
存在するキーを取得する方法を判断するメソッドはありません。キーが存在するかどうかを判断する唯一の方法は、エラーハンドラを使用することです。
Public Function KeyExistsInCollection(ByVal key As String, _
ByRef container As Collection) As Boolean
With Err
If container Is Nothing Then .Raise 91
On Error Resume Next
Dim temp As Variant
temp = container.Item(key)
On Error GoTo 0
If .Number = 0 Then
KeyExistsInCollection = True
ElseIf .Number <> 5 Then
.Raise .Number
End If
End With
End Function
アイテム
アイテムがCollection
含まれているかどうかを判断する唯一の方法は、アイテムが見つかるまでCollection
を反復することです。 Collection
はプリミティブまたはオブジェクトのいずれかが含まれる可能性があるため、比較時に実行時エラーが発生するのを避けるために、いくつかの処理が必要です。
Public Function ItemExistsInCollection(ByRef target As Variant, _
ByRef container As Collection) As Boolean
Dim candidate As Variant
Dim found As Boolean
For Each candidate In container
Select Case True
Case IsObject(candidate) And IsObject(target)
found = candidate Is target
Case IsObject(candidate), IsObject(target)
found = False
Case Else
found = (candidate = target)
End Select
If found Then
ItemExistsInCollection = True
Exit Function
End If
Next
End Function
コレクションからすべてのアイテムをクリアする
Collection
からすべてのアイテムを消去する最も簡単な方法は、新しいCollection
置き換えて、古いCollection
を範囲外にすることです。
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
End With
Debug.Print foo.Count 'Prints 3
Set foo = New Collection
Debug.Print foo.Count 'Prints 0
End Sub
ただし、 Collection
への複数の参照が保持されている場合、このメソッドは割り当てられた変数の空のCollection
提供します 。
Public Sub Example()
Dim foo As New Collection
Dim bar As Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
End With
Set bar = foo
Set foo = New Collection
Debug.Print foo.Count 'Prints 0
Debug.Print bar.Count 'Prints 3
End Sub
この場合、内容を消去する最も簡単な方法は、 Collection
内の項目の数をループして、最も低い項目を繰り返し削除することです。
Public Sub ClearCollection(ByRef container As Collection)
Dim index As Long
For index = 1 To container.Count
container.Remove 1
Next
End Sub