Recherche…
Remarques
Une Collection
est un objet conteneur inclus dans le runtime VBA. Aucune référence supplémentaire n'est requise pour l'utiliser. Une Collection
peut être utilisée pour stocker des éléments de n'importe quel type de données et permet leur récupération par l'index ordinal de l'élément ou en utilisant une clé unique facultative.
Comparaison des fonctionnalités avec les tableaux et les dictionnaires
Collection | Tableau | dictionnaire | |
---|---|---|---|
Peut être redimensionné | Oui | Parfois 1 | Oui |
Les articles sont commandés | Oui | Oui | Oui 2 |
Les articles sont fortement typés | Non | Oui | Non |
Les objets peuvent être récupérés par ordinal | Oui | Oui | Non |
De nouveaux éléments peuvent être insérés à l'ordinal | Oui | Non | Non |
Comment déterminer si un article existe | Itérer tous les articles | Itérer tous les articles | Itérer tous les articles |
Les éléments peuvent être récupérés par clé | Oui | Non | Oui |
Les clés sont sensibles à la casse | Non | N / A | Facultatif 3 |
Comment déterminer si une clé existe | Gestionnaire d'erreur | N / A | .Exists fonction |
Supprimer tous les articles | .Remove et .Remove | Erase , ReDim | .RemoveAll fonction |
1 Seuls les tableaux dynamiques peuvent être redimensionnés et seule la dernière dimension des tableaux multidimensionnels.
2 Les .Keys
et .Items
sous- .Items
sont ordonnés.
3 Déterminé par la propriété .CompareMode
.
Ajout d'éléments à une collection
Les éléments sont ajoutés à une Collection
en appelant sa méthode .Add
:
Syntaxe:
.Add(item, [key], [before, after])
Paramètre | La description |
---|---|
article | L'article à stocker dans la Collection . Cela peut être essentiellement n'importe quelle valeur à laquelle une variable peut être affectée, y compris les types primitifs, les tableaux, les objets et Nothing . |
clé | Optionnel. Une String qui sert d'identificateur unique pour récupérer des éléments de la Collection . Si la clé spécifiée existe déjà dans la Collection , cela entraînera une erreur d'exécution 457: "cette clé est déjà associée à un élément de cette collection". |
avant | Optionnel. Une clé existante (valeur de String ) ou un index (valeur numérique) pour insérer l'élément avant dans la Collection . Si une valeur est donnée, le paramètre after doit être vide ou une erreur d'exécution 5: "appel ou argument de procédure non valide". Si une clé String est transmise qui n'existe pas dans la Collection , une erreur d'exécution 5: «appel ou argument de procédure non valide» est générée. Si un index numérique est transmis qui n'existe pas dans la Collection , il en résultera une erreur d'exécution 9: "indice hors limites". |
après | Optionnel. Une clé existante (valeur de String ) ou un index (valeur numérique) pour insérer l'élément après dans la Collection . Si une valeur est donnée, le paramètre before doit être vide. Les erreurs soulevées sont identiques au paramètre before . |
Remarques:
Les clés ne sont pas sensibles à la casse.
.Add "Bar", "Foo"
et.Add "Baz", "foo"
entraînera une collision de clé.Si aucun des paramètres facultatifs avant ou après n'est indiqué, l'élément sera ajouté après le dernier élément de la
Collection
.Les insertions effectuées en spécifiant un paramètre avant ou après modifieront les index numériques des membres existants pour correspondre à leur nouvelle position. Cela signifie que des précautions doivent être prises lors de l'insertion de boucles dans des index numériques.
Échantillon utilisation:
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
Suppression d'éléments d'une collection
Les éléments sont supprimés d'une Collection
en appelant sa méthode .Remove
:
Syntaxe:
.Remove(index)
Paramètre | La description |
---|---|
indice | L'article à retirer de la Collection . Si la valeur passée est un type numérique ou un Variant avec un sous-type numérique, il sera interprété comme un index numérique. Si la valeur passée est une String ou un Variant contenant une chaîne, elle sera interprétée comme la clé. Si une clé String est transmise qui n'existe pas dans la Collection , une erreur d'exécution 5: «appel ou argument de procédure non valide» est générée. Si un index numérique est transmis qui n'existe pas dans la Collection , il en résultera une erreur d'exécution 9: "indice hors limites". |
Remarques:
- La suppression d'un élément d'une
Collection
modifie les index numériques de tous les éléments après ceux-ci dans laCollection
.For
boucles qui utilisent des index numériques et des éléments à supprimer, exécutez lesStep -1
vers l'arrière (Step -1
) pour empêcher les exceptions d'index et les éléments ignorés. - Les éléments ne doivent généralement pas être retirés d'une
Collection
à l'intérieur d'une boucleFor Each
car ils peuvent donner des résultats imprévisibles.
Échantillon utilisation:
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
Obtenir le nombre d'articles d'une collection
Le nombre d'éléments dans une Collection
peut être obtenu en appelant sa fonction .Count
:
Syntaxe:
.Count()
Échantillon utilisation:
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
Récupération d'éléments d'une collection
Les éléments peuvent être extraits d'une Collection
en appelant la fonction .Item
.
Syntaxe:
.Item(index)
Paramètre | La description |
---|---|
indice | L'article à récupérer de la Collection . Si la valeur passée est un type numérique ou un Variant avec un sous-type numérique, il sera interprété comme un index numérique. Si la valeur passée est une String ou un Variant contenant une chaîne, elle sera interprétée comme la clé. Si une clé String est transmise qui n'existe pas dans la Collection , une erreur d'exécution 5: «appel ou argument de procédure non valide» est générée. Si un index numérique est transmis qui n'existe pas dans la Collection , il en résultera une erreur d'exécution 9: "indice hors limites". |
Remarques:
-
.Item
est le membre par défaut deCollection
. Cela permet une flexibilité dans la syntaxe, comme le montre l'exemple d'utilisation ci-dessous. - Les index numériques sont basés sur 1.
- Les clés ne sont pas sensibles à la casse.
.Item("Foo")
et.Item("foo")
font référence à la même clé. - Le paramètre d' index n'est pas implicitement converti en nombre à partir d'une
String
ou vice-versa. Il est tout à fait possible que.Item(1)
et.Item("1")
réfèrent à différents éléments de laCollection
.
Exemple d'utilisation (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
Exemple d'utilisation (clés):
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
Exemple d'utilisation (syntaxe alternative):
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
Notez que la syntaxe bang ( !
) Est autorisée car .Item
est le membre par défaut et peut prendre un seul argument String
. L'utilité de cette syntaxe est discutable.
Déterminer si une clé ou un objet existe dans une collection
Clés
Contrairement à un scripting.Dictionary , une Collection
ne possède pas de méthode pour déterminer si une clé donnée existe ou pour récupérer des clés présentes dans la Collection
. La seule méthode pour déterminer si une clé est présente est d'utiliser le gestionnaire d'erreurs:
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
Articles
La seule façon de déterminer si un élément est contenu dans une Collection
consiste à parcourir la Collection
jusqu'à ce que l'élément soit localisé. Notez qu'une Collection
peut contenir des primitives ou des objets, une manipulation supplémentaire est nécessaire pour éviter les erreurs d'exécution lors des comparaisons:
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
Effacer tous les articles d'une collection
Le moyen le plus simple d’effacer tous les éléments d’une Collection
est de simplement le remplacer par une nouvelle Collection
et de laisser l’ancien hors de portée:
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
Cependant, s'il existe plusieurs références à la Collection
, cette méthode ne vous donnera qu'une Collection
vide pour la variable affectée .
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
Dans ce cas, la méthode la plus simple pour effacer le contenu consiste à parcourir le nombre d'éléments de la Collection
et à supprimer de manière répétée l'élément le plus bas:
Public Sub ClearCollection(ByRef container As Collection)
Dim index As Long
For index = 1 To container.Count
container.Remove 1
Next
End Sub