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 i Collection . 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 en For 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 i Collection . 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 i Collection .

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow