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 derCollection
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 einerFor 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 vonCollection
. 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 derCollection
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