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 de Collection 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 een For 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 van Collection . 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 de Collection .

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow