Les collections et les dictionnaires en VBA

Des structures de données bien sympathiques

En informatique, les structures de données sont, comme leur nom l’indique, un moyen d’organiser les données. C’est l’usage voulu, avec la nature des données et des opérations à effectuer, qui permettra de définir la structure de données la plus adaptée.

Le langage de macro VBA apporte dans son sillage des structures de données. Vous connaissez peut-être les tableaux (Array).

Au cours de ce billet, nous allons en étudier deux en particulier : les collections et les dictionnaires.

Pour ce billet, nous nous placerons dans l’environnement Microsoft Office.

C’est parti !

Les collections

Une collection permet de contenir des éléments de façon ordonnée. Ses membres ne doivent pas nécessairement avoir le même type.

Représentation d'une collection.
Représentation d’une collection.

Les collections sont très répandues dans l’interface de programmation de Microsoft Office et vous avez sans doute l’habitude de les utiliser au quotidien ! La propriété Sheets représentant les feuilles d’un classeur est une collection par exemple.

Représentation d'une collection Sheets.
Représentation d’une collection Sheets.

Créer une collection

Nous pouvons déclarer puis instancier un objet de type Collection de la sorte :

Dim cNotes As Collection
Set cNotes = New Collection

Ajouter des éléments à une collection

La méthode Add permet d’ajouter des éléments à une collection. En second argument, il est possible d’indiquer une clef sous forme de chaîne de caractères, sorte d’alias qui nous permettra de manipuler l’élément au même titre que son index dans les méthodes.

cNotes.Add 18, "top"
cNotes.Add (12)
cNotes.Add (14)

Supprimer des éléments d’une collection

La méthode Remove permet de supprimer des éléments d’une collection. Nous pouvons lui passer la position ou la clef de l’élément à enlever.

cNotes.Remove (1) 'équivalent de cNotes.Remove ("top")

Lorsqu’un élément est supprimé, les autres sont réordonnés en conséquence.

Accéder à un élément d’une collection

Pour accéder à un élément en fonction de son index ou de sa clef, il y existe la méthode Item ou encore le sucre syntaxique ().

Debug.Print (cNotes.Item(1)) ' 12
Debug.Print (cNotes(1)) ' 12

Obtenir la longueur d’une collection

La propriété Count nous permet de savoir le nombre d’éléments présents dans la collection.

Debug.Print (cNotes.Count) ' 2

Itérer sur une collection

Les collections peuvent être parcourues avec une boucle For Each.

Dim vNote As Variant
For Each vNote In cNotes
    Debug.Print (vNote) 
    ' 12
    ' 14
Next vNote

Il est tout à fait possible d’itérer avec une boucle For en connaissant la longueur de la collection avec les index de la même façon que sur un tableau.

Modifier un élément dans une collection

Aucune méthode ne nous permet de modifier un élément directement. L’alternative est de supprimer l’élément de la collection et d’insérer le nouveau à la bonne place en indiquant un paramètre Before ou After à la méthode Add.

'cNotes(1) = 20 ' Erreur 424
cNotes.Remove (1)
cNotes.Add 20, Before:=1

Vider une collection

Il n’existe pas de méthode toute prête pour vider une collection. Une possibilité est de boucler sur tous les index de la fin au début et de supprimer chaque élément individuellement.

Une autre possibilité est de réinitialiser la collection.

Set cNotes = Nothing
Set cNotes = New Collection
Debug.Print (cNotes.Count) ' 0

Au cours de cette section, nous avons vu ce qu’étaient les collections et comment s’en servir en VBA.

Les dictionnaires

Dans la section précédente, nous avons vu que les collections fonctionnaient avec un principe de paire index/valeur, mais que nous pouvions donner une chaîne de caractères en clef pour aussi fonctionner avec une paire clef/valeur.

Ce dernier comportement rejoint celui des dictionnaires qui sont des tables dont les clefs sont des chaînes de caractères. Les dictionnaires sont plus adaptés à cet usage.

Représentation d'un dictionnaire.
Représentation d’un dictionnaire.

Avant de commencer, nous allons ajouter la référence Microsoft Scripting Runtime comme illustré ci-dessous :

Accès à la fenêtre des Références.
Accès à la fenêtre des Références.
Ajout référence Microsoft Scripting Runtime.
Ajout référence Microsoft Scripting Runtime.

Créer un dictionnaire

Nous pouvons déclarer puis instancier un objet dictionnaire de la sorte :

Dim dictFruits As Scripting.Dictionary
Set dictFruits = New Scripting.Dictionary

Ajouter des éléments à un dictionnaire

Pour ajouter des éléments à un dictionnaire, nous pouvons utiliser la méthode Add en indiquant une clef en premier argument et un élément en second.

dictFruits.Add "pomme", 3
dictFruits.Add "framboise", 7
dictFruits.Add "kiwi", 2

Comme les collections, les dictionnaires peuvent contenir des éléments de types différents.

Supprimer des éléments d’un dictionnaire

Nous pouvons supprimer un élément au travers la méthode Remove en indiquant la clef de l’élément à supprimer.

dictFruits.Remove ("framboise")

Accéder à un élément d’un dictionnaire

Pour accéder à un élément en fonction de sa clef, il y existe la méthode Item ou encore le sucre syntaxique ().

Debug.Print (dictFruits.Item("pomme")) ' 3
Debug.Print (dictFruits("pomme")) ' 3

Obtenir la longueur d’un dictionnaire

La propriété Count nous permet de savoir le nombre d’éléments présents dans le dictionnaire.

Debug.Print (dictFruits.Count) ' 2

Vérifier l’existence d’une clef dans le dictionnaire

Nous pouvons vérifier si une clef est présente ou non dans un dictionnaire avec la méthode Exists en indiquant la clef à tester.

If dictFruits.Exists("framboise") Then
    Debug.Print ("framboise dans dictFruits")
Else
    Debug.Print ("pas de framboise")
End If ' pas de framboise

Itérer sur un dictionnaire

La propriété Items contient toutes les valeurs et nous permet d’itérer de la sorte :

Dim vPrix As Variant
For Each vPrix In dictFruits.Items
    Debug.Print (vPrix)
    ' 3
    ' 2
Next vPrix

La propriété Keys contient toutes les clefs et nous permet d’itérer en connaissant les clefs :

Dim vFruit As Variant
For Each vFruit In dictFruits.Keys
    Debug.Print vFruit, dictFruits(vFruit)
    ' pomme 3
    ' kiwi 2
Next vFruit

Modifier une valeur dans un dictionnaire

Contrairement aux collections, il est possible de modifier un élément de dictionnaire. Cela se fait ainsi :

dictFruits("pomme") = 5
Debug.Print (dictFruits("pomme")) ' 5

Modifier une clef dans un dictionnaire

Nous pouvons aussi modifier une clef pour la renommer par exemple.

dictFruits.Key("pomme") = "pommeverte"
Debug.Print (dictFruits.Exists("pomme")) ' Faux

Vider un dictionnaire

Nous pouvons supprimer l’intégralité du contenu d’un dictionnaire à l’aide de sa méthode RemoveAll.

dictFruits.RemoveAll
Debug.Print (dictFruits.Count) ' 0

Durant cette section, nous avons vu ce qu’étaient les dictionnaires et comment les utiliser en VBA.


C’est déjà la fin de ce billet.

Au cours de celui-ci, nous avons découvert deux structures de données utilisables en VBA : les collections et les dictionnaires. Celles-ci s’utilisent en fonction des besoins pour nos macros.

Certaines structures ne sont pas disponibles de base et doivent être implémentées soi-même comme les arbres par exemple.

À bientôt !

Quelques ressources :

Aucun commentaire

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte