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 la Collection . For boucles qui utilisent des index numériques et des éléments à supprimer, exécutez les Step -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 boucle For 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 de Collection . 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 la Collection .

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow