Une fonctionnalité moins connue, mais d'autant plus utile, de VBA est l'utilisation de la structure "Dictionnaire" pour stocker les données dans la mémoire de l'ordinateur. Le mot "mémoire" vous fait peur? Pas de panique, c'est simple et utile!
Cette fonctionnalité permet de contenir de grandes quantités de données disponibles immédiatement à l'utilisation et cette utilisation est particulièrement rapide. En gros, vous n'avez pas besoin de stocker vos données dans les Feuilles – ils sont à votre disposition dans la mémoire tant que votre macro tourne. Le plus souvent, on utilise la mémoire de cette manière pour charger des données "externes" (un fichier TXT ou les données d'une base de données par exemple) ce qui permet ensuite de les utiliser "à l'intérieur d'Excel" de manière très simple et rapide.
La structure "Dictionnaire" dont nous parlons ici attribue une Valeur à une Clé. De cette manière, il est possible d'aller chercher la Valeur (chaîne de texte, nombre, array,…) en utilisant la Clé.
Exemple (pour voir de quoi on parle):
Clé (code postal) –> Valeur (ville)
68100 –> "Mulhouse"
83990 –> "Saint Tropez"
72000 –> "Le Mans"
Comme vous pouvez constater, dans ce cas-ci, on attribue le nom de la ville (Valeur
) à un code postal (Clé
). Plus tard, il nous suffira de demander "quelle ville a le code postal "72000" et on aura immédiatement la réponse. Cela fonctionne dans l'autre sens aussi. Donc pas besoin de faire des boucles et devoir parcourir les données à chaque fois que l'on cherche un code postal… Gain de temps garanti!
Comment cela se passe et pratique en VBA
Deux méthodes sont possibles pour pouvoir utiliser cette structure. Le choix dépend de votre possibilité d'utiliser les Références car la méthode plus simple requiert la présence de la Référence Microsoft Scripting Runtime
. Il s'agit d'une des Références de base fournies dans chaque installation d'Excel mais qui n'est pas activée par défaut. Pour pouvoir l'utiliser, vous devez avoir la possibilité de l'activer.
Si ce n'est pas possible, vous pouvez utiliser l'objet Collection
qui ne requiert aucune Référence supplémentaire.
Méthode 1: Utilisation de Scripting.Dictionary
Pour pouvoir utiliser cette méthode, assurez vous que la Référence Microsoft Scripting Runtime
est activée.
Là, vous verrez la liste des Références disponibles. Trouvez celle qui vous faut et cochez sa case.
Pour information, les Références sont triées par ordre alphabétique sauf les Références utilisées (cochées) qui sont en haut de la liste.
Voici donc la manière de créer et remplir votre Dictionnaire en VBA
Les explications se trouvent en tant que commentaires dans le code VBA même…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub StructureDictionnaire() 'par Excel-Malin.com ( https://excel-malin.com ) ' code nécessite que la référence "Microsoft Scripting Runtime" soit activée '------------------------------------------------ 'création de l'Objet Dictionnaire Dim MonDico As New Scripting.Dictionary 'création de la Clé et de sa Valeur Cle = 68100 Valeur = "Mulhouse" 'vérification si la Clé n'est pas déjà présente dans le Dictionnaire If Not MonDico.Exists(Cle) Then 'ajout de la paire Clé + Valeur dans le Dictionnaire MonDico.Add Cle, Valeur End If 'pour accéder à la Valeur de la Clé: MsgBox MonDico(Cle) 'si la Clé est contenue dans une variable (dépend de l'utilisation) MsgBox MonDico(68100) 'on peut utiliser la Clé directement (dépend de l'utilisation) 'pour supprimer le Dictionnaire de la mémoire Set MonDico = Nothing End Sub |
Il est évident que l'utilisation de Dictionnaire n'a de sens que quand elle est utilisée en combinaison avec une boucle qui vous permettra de remplir le Dictionnaire à partir des données (fichier texte, contenu d'un fichier Excel etc.).
Et voici quelques autres opérations pour vous aider à gérer votre Dictionnaire (dans les exemples suivants, Cle
est le nom de la variable contenant la clé):
MonDico.Count
– affiche le nombre de paires clé/valeur dans le DictionnaireMonDico.Exists(Cle)
– vérifie si la clé existe dans le Dictionnaire (retourneTrue
ouFalse
)MonDico.Remove(Cle)
– supprime la paire clé/valeur spécifié du Dictionnaire
Pour lister les valeurs dans le Dictionnaire, vous pouvez utiliser le code suivant:
1 2 3 4 |
For Each TestValeurDico In MonDico.Keys MsgBox TestValeurDico 'affiche la clé MsgBox MonDico(TestValeurDico) 'affiche la valeur de la clé Next TestValeurDico |
Méthode 2: utilisation de l'Objet de type Collection
Si, pour une raison quelconque, vous n'avez pas la possibilité d'utiliser la référence "Microsoft Scripting Runtime
", vous pouvez créer votre Dictionnaire en créant un Object
de type Collection
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub CollectionDictionnaire() 'définition des variables Dim MonDico As Collection Set MonDico = New Collection 'ajouter les valeurs dans le Dictionnaire 'ATTENTION: les valeurs et les clés doivent êtres des chaînes de caractères (String) MonDico.Add "Mulhause", "68100" MonDico.Add "Saint Tropez", "83990" MonDico.Add "Le Mans", "72000" 'pour accéder à la Valeur de la Clé: MsgBox MonDico.Item("83990") 'pour supprimer le Dictionnaire de la mémoire Set MonDico = Nothing End Sub |
Il y a deux bémols dans cette solution:
- les valeurs et les clés doivent être formatées comme chaînes de caractères (
String
) - la nécessité de passer par une fonction supplémentaire si vous avez besoin de vérifier la présence d'une clé dans votre Dictionnaire. Pour cela, vous pouvez utiliser la fonction suivante:
1 2 3 4 5 6 7 8 9 |
Public Function CleEstPresente(Dico As Collection, Cle As Variant) As Boolean Dim TestObject As Variant On Error GoTo CleEstPresenteErreur CleEstPresente = True TestObject = Dico(Cle) Exit Function CleEstPresenteErreur: CleEstPresente = False End Function |
Dans la pratique, cela donne le code suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub TestDictionnaire() 'définition des variables Dim MonDico As Collection Set MonDico = New Collection 'ajouter les valeurs dans le Dictionnaire 'ATTENTION: les valeurs et les clés doivent êtres des chaînes de caractères (String) MonDico.Add "Mulhause", "68100" MonDico.Add "Saint Tropez", "83990" MonDico.Add "Le Mans", "72000" 'afficher la Valeur si la clé existe dans le Dictionnaire If CleEstPresente(MonDico, "68100") = True Then MsgBox MonDico.Item("68100") 'pour supprimer le Dictionnaire de la mémoire Set MonDico = Nothing End Sub |
Dictionnaire en VBA: Conclusion
Vous voici donc familiarisés à l'utilisation de Dictionnaires en VBA. Vous savez maintenant créer un Dictionnaire, le remplir et en extraire une Valeur souhaitée. Il s'agit d'une construction très pratique et relativement facile à mettre en oeuvre. A utiliser sans modération!
Si vous trouvez un cas intéressant d'utilisation de cette structure, n'hésitez pas à le mentionner dans les commentaires…
Pour en savoir (encore) plus: voici le lien vers la page web Microsoft consacrée à l'objet Dictionary. Comme vous le constaterez, l'information disponible sur la page de Microsoft est assez sommaire (d'où la raison de ce tutoriel) mais elle peut vous être utile comme point de départ pour l'exploration d'autres possibilités…
>>> La suite n°1 de ce tutoriel: Trier le Dictionnaire dans VBA (par clé et par valeur) <<<
>>> La suite n°2 de ce tutoriel: Dictionnaire VBA – les techniques avancées <<<
Pour aller plus loin en VBA
Sur ce site, vous trouverez d'autres articles et tutoriels qui vous aideront à développer vos connaissances de VBA. En voici quelques uns…
- Formation VBA gratuite en ligne: "VBA: Droit au but"
- Liste de toutes les fonctions VBA
- Codes sources VBA prêts à l'emploi
- Calculer la SOMME en VBA
- Comment utiliser RECHERCHEV en VBA? (tutoriel)
- Envoyer un email à partir d'Excel avec VBA
8 commentaires sur “La structure “Dictionnaire” dans VBA (tutoriel)”
Bonjour,
Je suis un éternel novice "débutant" et je n'ai pas compris comment utiliser ce dictionnaire.
Pourriez nous donnez quelques exemples plus précis avec le code complet pour les débutants?
Peut-on ajouter des phrases ou seulement des mots et jusqu'à combien de mots pouvons-nous mettre en mémoire dans ce dico?
merci
Bonjour Geoffroy.
En fait, il s'agit de la "structure dictionnaire" et non d'un dictionnairre au sens propre. Bien qu'il soit possible cette structure pour créer un vrai dictionnaire. Mais cela peut servir aussi bien pour de nombreuses autres applications…
Pour ce qui est du nombre de mots pouvant être utilisés, on parle de dizaines de milliers…
Et pour les phrases, c'est évidemment possible – il s'agit de faire le lien entre deux éléments. Peu importe s'il s'agit des mots, des phrases, des numéros de téléphone,… Une paire "Le chat est blanc." et "The cat is white." est tout à fait utilisable.
Concernant votre idée d'un "vrai dictionnaire", pouvez vous être plus précis? S'il y a une demande pour un tel outil, je pourrais envisager d'en créer un (dans la mesure du temps disponible).
Bonjour,
Pour les cas ou la référence n'est pas activée sur un poste j'ai écris ce petit bout de code sans prétention qui active la bibliothèque en l'identifiant par son GUID c'est à dire son identifiant normalement unique et commun aux différentes versions d'office. J'ajoute son chargement au démarrage du classeur:
Merci à vous pour ce commentaire utile.
Merci pour ce tutoriel.
C'est ce que je cherchais. De plus, c'est bien structuré et claire…
Bonjour,
Peut on donner plusieurs valeur à une clé ? Je m'explique :
J'ai un fichier source dans lequel se trouve plusieurs lignes avec dans la première cellule de chaque ligne le d'une ville et dans les autres cellules de la ligne des informations sur cette ville. Ainsi la ville est la clé.
Et je dois dans un autre fichier créer une feuille par ville (donc par ligne dans le fichier source) et donc aller chercher l'info sur chaque ville (des dizaines de cellules par ville) pour la reporter sur la feuille de la ville correspondante.
Bonjour,
Pour faire cela, il faudra passer par les modules de classes.
Vous pouvez m'envoyer un bout de tableau avec votre demande.
Cordialement
Merci pour ce Tuto