Zoeken…
Opmerkingen
Een Collection
is een containerobject dat is opgenomen in de VBA-runtime. Er zijn geen aanvullende referenties nodig om het te gebruiken. Een Collection
kan worden gebruikt om items van elk gegevenstype op te slaan en maakt ophalen mogelijk via de ordinale index van het item of met behulp van een optionele unieke sleutel.
Functievergelijking met arrays en woordenboeken
Verzameling | reeks | Woordenboek | |
---|---|---|---|
Kan worden aangepast | Ja | Soms 1 | Ja |
Items zijn besteld | Ja | Ja | Ja 2 |
Items worden sterk getypt | Nee | Ja | Nee |
Items kunnen worden opgehaald via ordinal | Ja | Ja | Nee |
Nieuwe items kunnen worden ingevoegd bij ordinal | Ja | Nee | Nee |
Hoe te bepalen of een item bestaat | Herhaal alle items | Herhaal alle items | Herhaal alle items |
Items kunnen met de sleutel worden opgehaald | Ja | Nee | Ja |
Toetsen zijn hoofdlettergevoelig | Nee | N / A | Optioneel 3 |
Hoe te bepalen of een sleutel bestaat | Foutafhandeling | N / A | .Exists functie |
Verwijder alle items | Iterate en .Remove | Erase , ReDim | .RemoveAll functie verwijderen |
1 Alleen dynamische arrays kunnen worden aangepast en alleen de laatste dimensie van multidimensionale arrays.
2 De onderliggende .Keys
en .Items
worden besteld.
3 Bepaald door de eigenschap .CompareMode
.
Items toevoegen aan een verzameling
Items worden aan een Collection
toegevoegd door de .Add
methode aan te roepen:
Syntaxis:
.Add(item, [key], [before, after])
Parameter | Beschrijving |
---|---|
item | Het item dat moet worden opgeslagen in de Collection . Dit kan in wezen elke waarde zijn waaraan een variabele kan worden toegewezen, inclusief primitieve typen, arrays, objecten en Nothing . |
sleutel | Optioneel. Een String die dient als een unieke identificatie voor het ophalen van items uit de Collection . Als de opgegeven sleutel al bestaat in de Collection , resulteert dit in een runtime-fout 457: "Deze sleutel is al gekoppeld aan een element van deze verzameling". |
voordat | Optioneel. Een bestaande sleutel ( String ) of index (numerieke waarde) om het item eerder in de Collection in te voegen. "Invalid procedure call of argument" zal resulteren: Als een waarde wordt gegeven, moet de na parameter leeg of een Run-time error 5 zijn. Als een String sleutel wordt doorgegeven die niet bestaat in de Collection , ontstaat een runtime-fout 5: "Ongeldige procedureaanroep of argument". Als een numerieke index wordt doorgegeven die niet bestaat in de Collection , resulteert een runtime-fout 9: "Subscript buiten bereik". |
na | Optioneel. Een bestaande sleutel ( String ) of index (numerieke waarde) om het item in te voegen in de Collection . Als een waarde wordt gegeven, moet de voor parameter leeg zijn. Opgegeven fouten zijn identiek aan de parameter before . |
Opmerkingen:
Toetsen zijn niet hoofdlettergevoelig.
.Add "Bar", "Foo"
en.Add "Baz", "foo"
zal resulteren in een belangrijke botsing.Als geen van de optionele parameters voor of na wordt opgegeven, wordt het item toegevoegd na het laatste item in de
Collection
.Invoegingen gemaakt door een parameter voor of na op te geven , veranderen de numerieke indexen van bestaande leden zodat deze overeenkomen met hun nieuwe positie. Dit betekent dat voorzichtigheid is geboden bij het maken van invoegingen in lussen met behulp van numerieke indexen.
Monster gebruik:
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
Items verwijderen uit een verzameling
Items worden uit een Collection
verwijderd door de methode .Remove
aan te roepen:
Syntaxis:
.Remove(index)
Parameter | Beschrijving |
---|---|
inhoudsopgave | Het item dat u uit de Collection wilt verwijderen. Als de doorgegeven waarde een numeriek type of Variant met een numeriek subtype is, wordt deze geïnterpreteerd als een numerieke index. Als de doorgegeven waarde een String of Variant die een tekenreeks bevat, wordt deze geïnterpreteerd als de sleutel a. Als een String-sleutel wordt doorgegeven die niet bestaat in de Collection , ontstaat een runtime-fout 5: "Ongeldige procedureaanroep of argument". Als een numerieke index wordt doorgegeven die niet bestaat in de Collection , resulteert een runtime-fout 9: "Subscript buiten bereik". |
Opmerkingen:
- Als u een item uit een
Collection
, worden de numerieke indexen van alle items erna in deCollection
gewijzigd.For
lussen die numerieke indexen gebruiken en items verwijderen, moeten achteruit lopen (Step -1
) om subscriptuitzonderingen en overgeslagen items te voorkomen. - Items mogen in het algemeen niet uit een
Collection
worden verwijderd vanuit eenFor Each
lus, omdat dit onvoorspelbare resultaten kan opleveren.
Monster gebruik:
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
Het aantal items van een verzameling verkrijgen
Het aantal items in een Collection
kan worden verkregen door de functie .Count
aan te roepen:
Syntaxis:
.Count()
Monster gebruik:
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
Items uit een verzameling ophalen
Items kunnen uit een Collection
worden opgehaald door de .Item
functie aan te roepen.
Syntaxis:
.Item(index)
Parameter | Beschrijving |
---|---|
inhoudsopgave | Het item dat uit de Collection moet worden opgehaald. Als de doorgegeven waarde een numeriek type of Variant met een numeriek subtype is, wordt deze geïnterpreteerd als een numerieke index. Als de doorgegeven waarde een String of Variant die een tekenreeks bevat, wordt deze geïnterpreteerd als de sleutel a. Als een String-sleutel wordt doorgegeven die niet bestaat in de Collection , ontstaat een runtime-fout 5: "Ongeldige procedureaanroep of argument". Als een numerieke index wordt doorgegeven die niet bestaat in de Collection , resulteert een runtime-fout 9: "Subscript buiten bereik". |
Opmerkingen:
-
.Item
is het standaardlid vanCollection
. Dit biedt flexibiliteit in syntaxis zoals aangetoond in het onderstaande voorbeeldgebruik. - Numerieke indexen zijn gebaseerd op 1.
- Toetsen zijn niet hoofdlettergevoelig.
.Item("Foo")
en.Item("foo")
verwijzen naar dezelfde sleutel. - De indexparameter wordt niet impliciet naar een getal uit een
String
of omgekeerd verzonden. Het is heel goed mogelijk dat.Item(1)
en.Item("1")
verwijzen naar verschillende items van deCollection
.
Voorbeeldgebruik (indexen):
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
Voorbeeldgebruik (toetsen):
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
Voorbeeldgebruik (alternatieve syntaxis):
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
Merk op dat de syntaxis van bang ( !
) Is toegestaan omdat .Item
het standaardlid is en een enkel String
argument kan aannemen. Het nut van deze syntaxis is twijfelachtig.
Bepalen of een sleutel of item in een verzameling voorkomt
Keys
In tegenstelling tot een Scripting.Dictionary heeft een Collection
geen methode om te bepalen of een bepaalde sleutel bestaat of een manier om sleutels op te halen die in de Collection
. De enige methode om te bepalen of een sleutel aanwezig is, is het gebruik van de foutafhandeling:
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
items
De enige manier om te bepalen of een item in een Collection
is door de Collection
te herhalen totdat het item is gevonden. Merk op dat omdat een Collection
primitieven of objecten kan bevatten, enige extra afhandeling nodig is om runtime-fouten tijdens de vergelijkingen te voorkomen:
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 items uit een verzameling wissen
De eenvoudigste manier om alle items uit een Collection
te wissen, is door deze eenvoudig door een nieuwe Collection
en de oude buiten bereik te laten:
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
Als er echter meerdere verwijzingen naar de Collection
, geeft deze methode u alleen een lege Collection
voor de toegewezen variabele .
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 dit geval is de eenvoudigste manier om de inhoud te wissen door het aantal items in de Collection
doorlopen en het laagste item herhaaldelijk te verwijderen:
Public Sub ClearCollection(ByRef container As Collection)
Dim index As Long
For index = 1 To container.Count
container.Remove 1
Next
End Sub