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 wCollection
.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ętliFor 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łonkiemCollection
. 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ówCollection
.
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