Szukaj…


Uwagi

Collection to obiekt kontenerowy zawarty w środowisku wykonawczym VBA. Aby go użyć, nie są wymagane żadne dodatkowe odniesienia. Collection może być używana do przechowywania elementów dowolnego typu danych i umożliwia wyszukiwanie według indeksu porządkowego elementu lub za pomocą opcjonalnego unikalnego klucza.


Porównanie funkcji z tablicami i słownikami

Kolekcja Szyk Słownik
Można zmienić rozmiar tak Czasem 1 tak
Przedmioty są zamawiane tak tak Tak 2
Elementy są mocno wpisane Nie tak Nie
Przedmioty można odzyskać porządkowo tak tak Nie
Nowe elementy można wstawiać na porządek tak Nie Nie
Jak ustalić, czy element istnieje Iteruj wszystkie elementy Iteruj wszystkie elementy Iteruj wszystkie elementy
Przedmioty można odzyskać według klucza tak Nie tak
W klawiszach rozróżniana jest wielkość liter Nie Nie dotyczy Opcjonalnie 3
Jak ustalić, czy klucz istnieje Obsługa błędów Nie dotyczy .Exists funkcja
Usuń wszystkie elementy Iteruj i .Remove Erase , ReDim .RemoveAll funkcje

1 Można zmieniać rozmiar tylko tablic dynamicznych i tylko ostatni wymiar tablic wielowymiarowych.

2 Podstawowe .Keys I .Items są uporządkowane.

3 Określone przez właściwość .CompareMode .

Dodawanie przedmiotów do kolekcji

Elementy są dodawane do Collection poprzez wywołanie jej metody .Add :

Składnia:

.Add(item, [key], [before, after])
Parametr Opis
pozycja Przedmiot do przechowywania w Collection . Może to być zasadniczo każda wartość, do której można przypisać zmienną, w tym typy pierwotne, tablice, obiekty i Nothing .
klucz Opcjonalny. String który służy jako unikalny identyfikator do pobierania elementów z Collection . Jeśli określony klucz już istnieje w Collection , spowoduje to błąd w czasie wykonywania 457: „Ten klucz jest już powiązany z elementem tej kolekcji”.
przed Opcjonalny. Istniejący klucz ( String value) lub indeks (wartość liczbowa), aby wstawić element wcześniej w Collection . Jeśli podano wartość, parametr po musi być pusty, w przeciwnym razie wystąpi błąd 5: „Niepoprawne wywołanie procedury lub argument”. Jeśli zostanie przekazany klucz String , który nie istnieje w Collection , wystąpi błąd wykonania 5: „Niepoprawne wywołanie procedury lub argument”. Jeśli zostanie przekazany indeks liczbowy, który nie istnieje w Collection , wystąpi błąd wykonania 9: „Indeks dolny poza zakresem”.
po Opcjonalny. Istniejący klucz ( String value) lub indeks (wartość liczbowa), aby wstawić element po w Collection . Jeśli podano wartość, parametr before musi być pusty. Zgłoszone błędy są identyczne z parametrem before .

Uwagi:

  • Klucze nie rozróżniają wielkości liter. .Add "Bar", "Foo" i .Add "Baz", "foo" spowoduje kolizję klucza.

  • Jeśli nie podano żadnego z opcjonalnych parametrów przed ani po , element zostanie dodany po ostatnim elemencie w Collection .

  • Wstawienia dokonane przez podanie parametru przed lub po zmienią indeksy liczbowe istniejących elementów, aby dopasować je do nowej pozycji. Oznacza to, że należy zachować ostrożność podczas wstawiania w pętlach za pomocą indeksów numerycznych.


Przykładowe użycie:

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

Usuwanie przedmiotów z kolekcji

Elementy są usuwane z Collection przez wywołanie jej metody .Remove :

Składnia:

.Remove(index)
Parametr Opis
indeks Element do usunięcia z Collection . Jeśli przekazana wartość jest typem liczbowym lub Variant z podtypem numerycznym, zostanie zinterpretowana jako indeks numeryczny. Jeśli przekazana wartość to String lub Variant zawierający ciąg, zostanie zinterpretowany jako klucz. Jeśli zostanie przekazany klucz String, który nie istnieje w Collection , wystąpi błąd wykonania 5: „Niepoprawne wywołanie procedury lub argument”. Jeśli zostanie przekazany indeks liczbowy, który nie istnieje w Collection , wystąpi błąd wykonania 9: „Indeks dolny poza zakresem”.

Uwagi:

  • Usunięcie elementu z Collection spowoduje zmianę indeksów liczbowych wszystkich elementów znajdujących się po nim w Collection . For pętli, które używają indeksów numerycznych i usuwają elementy, należy je uruchomić wstecz ( Step -1 ), aby zapobiec wyjątkom indeksu dolnego i pominiętym elementom.
  • Przedmioty na ogół nie powinny być usuwane z Collection wewnątrz pętli For Each , ponieważ może to dać nieprzewidywalne wyniki.

Przykładowe użycie:

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

Uzyskiwanie liczby pozycji w kolekcji

Liczbę elementów w Collection można uzyskać, wywołując jej funkcję .Count :

Składnia:

.Count()

Przykładowe użycie:

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

Pobieranie przedmiotów z kolekcji

Elementy można pobrać z Collection , wywołując funkcję .Item .

Składnia:

.Item(index)
Parametr Opis
indeks Przedmiot do odzyskania z Collection . Jeśli przekazana wartość jest typem liczbowym lub Variant z podtypem numerycznym, zostanie zinterpretowana jako indeks numeryczny. Jeśli przekazana wartość to String lub Variant zawierający ciąg, zostanie zinterpretowany jako klucz. Jeśli zostanie przekazany klucz String, który nie istnieje w Collection , wystąpi błąd wykonania 5: „Niepoprawne wywołanie procedury lub argument”. Jeśli zostanie przekazany indeks liczbowy, który nie istnieje w Collection , wystąpi błąd wykonania 9: „Indeks dolny poza zakresem”.

Uwagi:

  • .Item jest domyślnym członkiem Collection . Umożliwia to elastyczność składni, jak pokazano w przykładzie użycia poniżej.
  • Indeksy numeryczne są oparte na 1.
  • Klucze nie rozróżniają wielkości liter. .Item("Foo") i .Item("foo") odnoszą się do tego samego klucza.
  • Parametr indeks nie jest niejawnie oddanych do numeru z String lub wizy-versa. .Item(1) możliwe, że .Item(1) i .Item("1") odnoszą się do różnych elementów Collection .

Przykładowe użycie (indeksy):

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

Przykładowe użycie (klucze):

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

Przykładowe użycie (alternatywna składnia):

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

Zauważ, że składnia bang ( ! ) Jest dozwolona, ponieważ .Item jest domyślnym członkiem i może przyjmować pojedynczy argument String . Przydatność tej składni jest wątpliwa.

Ustalanie, czy klucz lub element istnieje w kolekcji

Klucze

W przeciwieństwie do Scripting.Dictionary , Collection nie ma metody określania, czy dany klucz istnieje, ani sposobu na odzyskanie kluczy obecnych w Collection . Jedyną metodą ustalenia, czy klucz jest obecny, jest użycie procedury obsługi błędów:

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

Przedmiotów

Jedynym sposobem ustalenia, czy element jest zawarty w Collection jest iteracja w Collection aż element zostanie zlokalizowany. Należy pamiętać, że ponieważ Collection może zawierać prymitywy lub obiekty, konieczna jest dodatkowa obsługa, aby uniknąć błędów w czasie wykonywania podczas porównań:

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

Usuwanie wszystkich elementów z kolekcji

Najłatwiejszym sposobem wyczyszczenia wszystkich elementów z Collection jest po prostu zastąpienie jej nową Collection i pozostawienie starego poza zakresem:

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

Jeśli jednak istnieje wiele odwołań do przechowywanej Collection , ta metoda da ci tylko pustą Collection dla przypisanej zmiennej .

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

W takim przypadku najłatwiejszym sposobem wyczyszczenia zawartości jest przejście przez liczbę elementów w Collection i wielokrotne usuwanie najniższego elementu:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow