La structure “Dictionnaire” dans VBA

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 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é).

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.

Microsoft_scripting_runtime

Astuce: Pour activer une Référence, allez dans l'éditeur VBA, dans le menu, choisissez "Outils" et ensuite "Références".
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…

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 Dictionnaire
  • MonDico.Exists(Cle) – vérifie si la clé existe dans le Dictionnaire (retourne True ou False)
  • 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:

 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.

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:
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:

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 de ce tutoriel: Trier le Dictionnaire dans VBA (par clé et par valeur) <<<

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…

156 0

Laissez un commentaire

Votre adresse e-mail ne sera pas publiée.

8 commentaires sur “La structure “Dictionnaire” dans VBA”