La structure “Dictionnaire” dans VBA 6


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.

La structure "Dictionnaire" en question 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:

Clé (code postal) –> Valeur (ville)
68100 –> "Mulhouse"
83990 –> "Saint Tropez"
72000 –> "Le Mans"

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

Voici donc la manière de créer et remplir votre Dictionnaire (code commenté)

 

Sub StructureDictionnaire()
'par Excel-Malin.com ( https://excel-malin.com )

' code nécéssite 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

 

Conclusion

Vous voici donc familiarisés à l'utilisation de Dictionnaires en VBA. 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 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) <<<

  

83 0



Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

6 commentaires sur “La structure “Dictionnaire” dans VBA

  • Geoffroy

    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

    • excel-malin.com Auteur du billet

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

  • Alex

    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:

    Private Sub Workbook_Open()
    Ajoutreference
    End Sub
    '--------------------------
    Public Sub Ajoutreference()
    Dim resultat
    On Error Resume Next
    ' Microsoft Scripting Runtime library pour utiliser la fonction dictionaire "Scripting.dictionary"
    resultat = ThisWorkbook.VBProject.References.AddFromGuid("{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0)
    On Error GoTo 0
    End Sub

  • Totor

    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.