Sub Dictionnaire()
Dim Plage As Range
Dim Cel As Range
Dim Dico As Object
Dim ListeCle As Variant
Dim Cle As Variant
Dim ListeElement As Variant
Dim Element As Variant
Dim I As Integer
'défini la plage
With Worksheets("Feuil1")
Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
'crée le dictionnaire
Set Dico = CreateObject("Scripting.Dictionary")
'parcour les cellules et ajoute au dico si la valeur n'existe pas
'Attention, comme un dictionnaire peut aussi contenir des objets comme des cellules
'il est important de préciser que c'est la valeur qu'on souhaite stocker même
'si "Value" est la propriété par défaut de la cellule car "Dico.Add Cel.Value, Cel.Offset(0, 1).Value"
'est différent de "Dico.Add Cel, Cel.Offset(0, 1)"
For Each Cel In Plage
If Dico.exists(Cel.Value) = False Then
Dico.Add Cel.Value, Cel.Offset(0, 1).Value
'la première "dimension", si on peut dire, est la clé et cette dernière est unique
'c'est pour cette raison qu'on teste si elle existe déjà ou non. Si on teste pas
'et qu'elle est déjà présente, une erreur se produit
'la seconde "dimension", est l'élément que contient la clé par contre, ce dernier
'peut être identique pour plusieur clés
End If
Next Cel
'on peut remplir un tableau en ajoutant les clés et les éléments sans boucle et il peuvent être de
'type différent
Dico.Add "Clé 1", "guigol"
Dico.Add "Clé 2", 20
Dico.Add "Clé 3", #2/17/2013#
'ici, dans une variable de type "Variant" on récupère la collection de clés du dico
ListeCle = Dico.Keys
'il suffit de parcourir la collection avec une boucle "For Next" ou "For Each Next"
'(dans le second cas, il faut une variable de type "Variant") pour extraire
'les noms de clés ou l'élément de la clé (ici, dans la fenêtre de débogage, Ctrl+G)
For I = 0 To Dico.Count - 1
Debug.Print ListeCle(I) '<-- nom de la clé
Debug.Print Dico(ListeCle(I)) '<-- élément de la clé
Next I
For Each Cle In Dico.Keys
Debug.Print Cle '<-- nom de la clé
Debug.Print Dico(Cle) '<-- élément de la clé
Next Cle
'si on connaît le nom de la clé, on peut dans ce cas obtenir directement l'élément qui lui est attaché
MsgBox Dico("Clé 2")
'Si le nom de la clé est faux, il est possible de le modifier de la façon suivante
'et ceci à la condition qu'il n'existe pas dans le dico (attention, ici Key est sans "s")
Dico.Key("Clé 2") = "Clé 4"
MsgBox Dico("Clé 4")
'récupère la collection des éléments dans une variable de type "Variant"
'il suffit de parcourir la collection avec une boucle "For Next" ou "For Each Next" comme pour
'la collection de clés
ListeElement = Dico.Items
For I = 0 To Dico.Count - 1
Debug.Print ListeElement(I)
Next I
For Each Element In Dico.Items
Debug.Print Element
Next Element
'comme il est possible de modifier le nom d'une clé, il est donc aussi possible de modifier
'la valeur de l'élément (ici aussi sans "s" à Item) mais à la différence des clés, les éléments
'peuvent avoir la même valeur
MsgBox Dico.Item("Clé 3")
Dico.Item("Clé 3") = 5
'ou directement
Dico("Clé 3") = 5
MsgBox Dico.Item("Clé 3")
'il est possible de supprimer une clé du dico
Dico.Remove "Clé 1"
'ou de vider tout le dico
Dico.RemoveAll
Set Dico = Nothing
End Sub