Suche…


Bemerkungen

Eine Collection ist ein Containerobjekt, das in der VBA-Laufzeitumgebung enthalten ist. Zur Verwendung sind keine zusätzlichen Referenzen erforderlich. Eine Collection kann zum Speichern von Elementen eines beliebigen Datentyps verwendet werden und ermöglicht das Abrufen entweder über den Ordnungsindex des Elements oder über einen optionalen eindeutigen Schlüssel.


Funktionsvergleich mit Arrays und Wörterbüchern

Sammlung Array Wörterbuch
Kann in der Größe verändert werden Ja Manchmal 1 Ja
Artikel sind bestellt Ja Ja Ja 2
Elemente sind stark typisiert Nein Ja Nein
Elemente können über die Ordinalzahl abgerufen werden Ja Ja Nein
Neue Elemente können an der Ordinalzahl eingefügt werden Ja Nein Nein
So können Sie feststellen, ob ein Artikel vorhanden ist Alle Elemente iterieren Alle Elemente iterieren Alle Elemente iterieren
Elemente können per Schlüssel abgerufen werden Ja Nein Ja
Bei den Tasten wird zwischen Groß- und Kleinschreibung unterschieden Nein N / A Optional 3
So stellen Sie fest, ob ein Schlüssel vorhanden ist Fehlerhandler N / A .Exists Funktion
Entfernen Sie alle Elemente Iterieren und .Remove Erase , ReDim .RemoveAll Funktion

1 Nur dynamische Arrays können in der Größe geändert werden, und nur die letzte Dimension von mehrdimensionalen Arrays.

2 Die zugrunde liegenden .Keys und .Items werden sortiert.

3 Bestimmt durch die .CompareMode Eigenschaft.

Elemente zu einer Sammlung hinzufügen

Die Artikel werden zu einer hinzugefügt Collection durch seinen Aufruf .Add Methode:

Syntax:

.Add(item, [key], [before, after])
Parameter Beschreibung
Artikel Der Artikel, der in der Collection gespeichert werden soll. Dies kann im Wesentlichen jeder Wert sein, dem eine Variable zugewiesen werden kann, einschließlich primitiver Typen, Arrays, Objekte und Nothing .
Schlüssel Wahlweise. Ein String , der als eindeutiger Bezeichner für das Abrufen von Elementen aus der Collection . Wenn der angegebene Schlüssel bereits in der Collection , führt dies zu einem Laufzeitfehler 457: "Dieser Schlüssel ist bereits einem Element dieser Sammlung zugeordnet."
Vor Wahlweise. Ein vorhandener Schlüssel ( String Wert) oder ein Index (numerischer Wert), um das Element zuvor in die Collection einzufügen. Wenn ein Wert angegeben wird, muss der nach Parameter leer sein oder ein Laufzeitfehler 5: „ungültiger Prozedur - Aufruf oder Argument“ wird zur Folge haben . Wenn ein String Schlüssel übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 5: "Ungültiger Prozeduraufruf oder -argument". Wenn ein numerischer Index übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 9: "Index außerhalb des gültigen Bereichs".
nach dem Wahlweise. Ein vorhandener Schlüssel ( String Wert) oder ein Index (numerischer Wert), nach dem das Element in die Collection . Wenn ein Wert angegeben wird, muss der vor Parameter leer sein. Fehler sind identisch mit dem Parameter before .

Anmerkungen:

  • Bei den Schlüsseln wird nicht zwischen Groß- und Kleinschreibung unterschieden. .Add "Bar", "Foo" und .Add "Baz", "foo" führt zu einer Schlüsselkollision.

  • Wenn keine der optionalen Vorher- oder Nachher- Parameter angegeben ist, wird der Artikel nach dem letzten Artikel in der Collection hinzugefügt.

  • Einfügungen, die durch Angabe eines Vorher- oder Nachher- Parameters vorgenommen werden, ändern die numerischen Indizes der vorhandenen Elemente an ihre neue Position. Dies bedeutet, dass beim Einfügen in Schleifen mit numerischen Indizes Vorsicht geboten ist.


Beispielverwendung:

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

Elemente aus einer Sammlung entfernen

Elemente werden aus einer Collection indem sie ihre .Remove Methode aufrufen:

Syntax:

.Remove(index)
Parameter Beschreibung
Index Das Element, das aus der Collection . Wenn der übergebene Wert ein numerischer Typ oder eine Variant mit einem numerischen Untertyp ist, wird er als numerischer Index interpretiert. Wenn der übergebene Wert ein String oder eine Variant die einen String enthält, wird dieser als Schlüssel interpretiert. Wenn ein String-Schlüssel übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 5: "Ungültiger Prozeduraufruf oder -argument". Wenn ein numerischer Index übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 9: "Index außerhalb des gültigen Bereichs".

Anmerkungen:

  • Durch das Entfernen eines Elements aus einer Collection werden die numerischen Indizes aller Elemente in der Collection geändert. For Schleifen , die numerische Indizes und Entfernen von Elementen verwenden sollte , rückwärts läuft ( Step -1 ) Index Ausnahmen zu verhindern und übersprungenen Elemente.
  • Elemente sollten im Allgemeinen nicht aus einer Collection aus einer For Each Schleife entfernt werden, da dies zu unvorhersehbaren Ergebnissen führen kann.

Beispielverwendung:

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

Abrufen der Elementanzahl einer Sammlung

Die Anzahl der Elemente in einer Collection kann durch Aufruf der .Count Funktion abgerufen werden:

Syntax:

.Count()

Beispielverwendung:

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

Elemente aus einer Sammlung abrufen

Elemente können aus einer Collection abgerufen werden, indem die Funktion .Item wird.

Syntax:

.Item(index)
Parameter Beschreibung
Index Das Element, das aus der Collection abgerufen werden soll. Wenn der übergebene Wert ein numerischer Typ oder eine Variant mit einem numerischen Untertyp ist, wird er als numerischer Index interpretiert. Wenn der übergebene Wert ein String oder eine Variant die einen String enthält, wird dieser als Schlüssel interpretiert. Wenn ein String-Schlüssel übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 5: "Ungültiger Prozeduraufruf oder -argument". Wenn ein numerischer Index übergeben wird, der in der Collection nicht vorhanden ist, führt dies zu einem Laufzeitfehler 9: "Index außerhalb des gültigen Bereichs".

Anmerkungen:

  • .Item ist das Standardmitglied von Collection . Dies ermöglicht Flexibilität in der Syntax, wie im folgenden Beispiel gezeigt.
  • Numerische Indizes basieren auf 1.
  • Bei den Schlüsseln wird nicht zwischen Groß- und Kleinschreibung unterschieden. .Item("Foo") und .Item("foo") beziehen sich auf denselben Schlüssel.
  • Der Index- Parameter wird nicht implizit in eine Zahl aus einem String oder umgekehrt umgewandelt. Es ist durchaus möglich, dass .Item(1) und .Item("1") auf verschiedene Elemente der Collection verweisen.

Beispielverwendung (Indizes):

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

Verwendungsbeispiel (Schlüssel):

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

Verwendungsbeispiel (alternative Syntax):

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

Beachten Sie, dass die Syntax bang ( ! ) .Item ist, da .Item das Standardmitglied ist und ein einzelnes String Argument annehmen kann. Der Nutzen dieser Syntax ist fragwürdig.

Bestimmen, ob ein Schlüssel oder ein Element in einer Sammlung vorhanden ist

Schlüssel

Im Gegensatz zu einem Scripting.Dictionary verfügt eine Collection nicht über eine Methode zum Bestimmen, ob ein bestimmter Schlüssel vorhanden ist, oder eine Methode zum Abrufen von in der Collection vorhandenen Schlüsseln. Die einzige Methode, um festzustellen, ob ein Schlüssel vorhanden ist, ist die Verwendung des Fehlerhandlers:

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

Artikel

Die einzige Möglichkeit festzustellen, ob ein Element in einer Collection ist, besteht darin, die Collection zu durchlaufen, bis das Element gefunden wurde. Beachten Sie, dass eine Collection einige Grundelemente oder Objekte enthalten kann. Daher ist eine zusätzliche Behandlung erforderlich, um Laufzeitfehler während der Vergleiche zu vermeiden:

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

Alle Elemente aus einer Sammlung löschen

Die einfachste Möglichkeit, alle Elemente aus einer Collection zu löschen, besteht darin, sie einfach durch eine neue Collection zu ersetzen und die alten aus dem Geltungsbereich zu lassen:

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

Wenn jedoch mehrere Verweise auf die Collection , gibt Ihnen diese Methode nur eine leere Collection für die zugewiesene Variable .

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

In diesem Fall können Sie den Inhalt am einfachsten löschen, indem Sie die Anzahl der Elemente in der Collection durchlaufen und das unterste Element wiederholt entfernen:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow