Sök…
Anmärkningar
En Collection
är ett containerobjekt som ingår i VBA-runtime. Inga ytterligare referenser krävs för att använda den. En Collection
kan användas för att lagra objekt av vilken datatyp som helst och gör det möjligt att hämta antingen objektets ordinalindex eller med en valfri unik nyckel.
Funktionsjämförelse med matriser och ordböcker
Samling | Array | Ordbok | |
---|---|---|---|
Kan ändra storlek | Ja | Ibland 1 | Ja |
Föremål beställs | Ja | Ja | Ja 2 |
Objekt är starkt skrivna | Nej | Ja | Nej |
Objekt kan hämtas med ordinal | Ja | Ja | Nej |
Nya artiklar kan sättas in vid ordinär | Ja | Nej | Nej |
Hur man avgör om en artikel finns | Iterera alla artiklar | Iterera alla artiklar | Iterera alla artiklar |
Objekt kan hämtas med nyckel | Ja | Nej | Ja |
Knappar är skiftlägeskänsliga | Nej | N / A | Valfritt 3 |
Hur man avgör om en nyckel finns | Felhanterare | N / A | .Exists funktion |
Ta bort alla föremål | Iterera och. .Remove | Erase , ReDim | .RemoveAll funktion |
1 Endast dynamiska matriser kan ändras och endast den sista dimensionen i flerdimensionella matriser.
2 De underliggande .Keys
och .Items
beställs.
3 .CompareMode
egenskapen .CompareMode
.
Lägga till artiklar i en samling
Objekt läggs till i en Collection
genom att anropa dess. .Add
metod:
Syntax:
.Add(item, [key], [before, after])
Parameter | Beskrivning |
---|---|
Artikel | Objektet som ska lagras i Collection . Detta kan vara väsentligen alla värden som en variabel kan tilldelas, inklusive primitiva typer, matriser, objekt och Nothing . |
nyckel | Valfri. En String som fungerar som en unik identifierare för att hämta objekt från Collection . Om den angivna nyckeln redan finns i Collection , kommer den att resultera i ett körningsfel 457: "Den här nyckeln är redan associerad med ett element i denna samling". |
innan | Valfri. En befintlig nyckel ( String ) eller index (numeriskt värde) för att infoga objektet tidigare i Collection . Om ett värde anges måste efter- parametern vara tom eller ett körtidfel 5: "Ogiltigt procedursamtal eller argument" kommer att resultera. Om en String passeras som inte finns i Collection , kommer ett körtidfel 5: "Ogiltigt procedursamtal eller argument" kommer att resultera. Om ett numeriskt index passeras som inte finns i Collection , kommer ett körtidfel 9: "Prenumeration utanför räckvidden" att resultera. |
efter | Valfri. En befintlig nyckel ( String ) eller index (numeriskt värde) för att infoga objektet efter i Collection . Om ett värde anges måste parametern före vara tom. Fel som tas upp är identiska med parametern före . |
Anmärkningar:
Nycklar är inte skiftlägeskänsliga.
.Add "Bar", "Foo"
och..Add "Baz", "foo"
kommer att resultera i en nyckelkollision.Om ingen av de valfria parametrarna före eller efter anges, läggs objektet till efter det sista objektet i
Collection
.Insättningar som gjorts genom att ange en före eller efter parameter kommer att ändra de numeriska indexen för befintliga medlemmar för att matcha deras nya position. Detta innebär att man bör vara försiktig när man gör insättningar i slingor med numeriska index.
Provanvändning:
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
Ta bort objekt från en samling
Objekt tas bort från en Collection
genom att anropa dess .Remove
metod:
Syntax:
.Remove(index)
Parameter | Beskrivning |
---|---|
index | Objektet som ska tas bort från Collection . Om det överförda värdet är en numerisk typ eller en Variant med en numerisk undertyp, kommer det att tolkas som ett numeriskt index. Om det överförda värdet är en String eller en Variant innehåller en sträng, kommer den att tolkas som en nyckel. Om en strängnyckel passeras som inte finns i Collection , kommer ett körtidfel 5: "Ogiltigt procedursamtal eller argument" kommer att resultera. Om ett numeriskt index passeras som inte finns i Collection , kommer ett körtidfel 9: "Prenumeration utanför räckvidden" att resultera. |
Anmärkningar:
- Att ta bort ett objekt från en
Collection
kommer att ändra numeriska index för alla objekt efter det iCollection
.For
slingor som använder numeriska index och tar bort objekt bör köras bakåt (Step -1
) för att förhindra undantag från prenumerationer och överhoppade objekt. - Objekt bör i allmänhet inte tas bort från en
Collection
från insidan av enFor Each
slinga eftersom det kan ge oförutsägbara resultat.
Provanvändning:
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
Hämta artikelns antal i en samling
Antalet objekt i en Collection
kan erhållas genom att ringa dess .Count
funktion:
Syntax:
.Count()
Provanvändning:
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
Hämta objekt från en samling
Objekt kan hämtas från en Collection
genom att anropa .Item
funktionen.
Syntax:
.Item(index)
Parameter | Beskrivning |
---|---|
index | Objektet som ska hämtas från Collection . Om det överförda värdet är en numerisk typ eller en Variant med en numerisk undertyp, kommer det att tolkas som ett numeriskt index. Om det överförda värdet är en String eller en Variant innehåller en sträng, kommer den att tolkas som en nyckel. Om en strängnyckel passeras som inte finns i Collection , kommer ett körtidfel 5: "Ogiltigt procedursamtal eller argument" kommer att resultera. Om ett numeriskt index passeras som inte finns i Collection , kommer ett körtidfel 9: "Prenumeration utanför räckvidden" att resultera. |
Anmärkningar:
-
.Item
är standardmedlem iCollection
. Detta möjliggör flexibilitet i syntax som visas i provanvändningen nedan. - Numeriska index är 1-baserade.
- Nycklar är inte skiftlägeskänsliga.
.Item("Foo")
och.Item("foo")
hänvisar till samma tangent. - Indexparametern är inte underförstått gjutas till ett nummer från en
String
eller visum versa. Det är helt möjligt att.Item(1)
och.Item("1")
hänvisar till olika artiklar iCollection
.
Exempel på användning (index):
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
Exempel på användning (nycklar):
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
Exempel på användning (alternativ 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
Observera att bang ( !
) -Syntax är tillåten eftersom .Item
är standardmedlem och kan ta ett enda String
. Nyttan av denna syntax är tveksam.
Bestämmer om en nyckel eller objekt finns i en samling
Keys
Till skillnad från en Scripting.Diction , har en Collection
inte en metod för att avgöra om en given nyckel finns eller ett sätt att hämta nycklar som finns i Collection
. Den enda metoden för att avgöra om en nyckel finns är att använda felhanteraren:
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
artiklar
Det enda sättet att avgöra om ett objekt finns i en Collection
är att iterera över Collection
tills objektet finns. Observera att eftersom en Collection
kan innehålla antingen primitiv eller objekt, behövs viss extra hantering för att undvika körtidfel under jämförelserna:
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
Rensa alla objekt från en samling
Det enklaste sättet att rensa alla objekt från en Collection
är att helt enkelt byta ut dem med en ny Collection
och låta den gamla gå ut ur räckvidden:
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
Men om det finns flera referenser till Collection
hålls, kommer den här metoden bara att ge dig en tom Collection
för den variabel som är tilldelad .
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
I detta fall är det enklaste sättet att rensa innehållet genom att gå igenom antalet objekt i Collection
och ta bort det lägsta objektet upprepade gånger:
Public Sub ClearCollection(ByRef container As Collection)
Dim index As Long
For index = 1 To container.Count
container.Remove 1
Next
End Sub