サーチ…


備考

Collectionは、VBAランタイムに含まれるコンテナオブジェクトです。それを使用するために追加の参照は必要ありません。 Collectionは、任意のデータ型の項目を格納するために使用でき、項目の順序インデックスまたはオプションの一意のキーを使用して検索することができます。


配列と辞書との機能比較

コレクション アレイ 辞書
サイズ変更可能はい時には1 はい
アイテムが注文されるはいはいはい2
アイテムは強く型付けされていますいいえはいいいえ
アイテムは序数で取り出すことができますはいはいいいえ
新しいアイテムを序数に挿入できますはいいいえいいえ
アイテムが存在するかどうかを判断する方法すべてのアイテムを反復するすべてのアイテムを反復するすべてのアイテムを反復する
アイテムはキーで取り出すことができますはいいいえはい
キーは大文字と小文字を区別しますいいえ N / A オプション3
キーが存在するかどうかを判断する方法エラーハンドラ N / A .Exists関数
すべてのアイテムを削除反復処理と.Remove EraseReDim .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で、それの後にすべての項目の数値インデックスを変更しますCollectionFor 、数値インデックスを使用して逆方向に実行する必要がある項目を削除するループ( 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: "下付き文字が範囲外です"が発生します。

ノート:

  • .ItemCollectionのデフォルトメンバーです。これにより、以下のサンプル使用法で示すように、構文の柔軟性が可能になります。
  • 数値インデックスは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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow