Afficher un élément d'un dictionnaire
Le
Apitos

Bonsoir à tous,
En voulant afficher un Item d'un dictionnaire "dic", j'ai eu un message d'e=
rreur :
'
i = 1
Set dic = CreateObject("Scripting.Dictionary")
'-- On remplit le dictionnaire dic
For Each C In WS2.Range("F2:F" & LastLg)
If Not dic.Exists(C.Value) Then
dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Offset(=
0, -5).Value
MsgBox dic.Items(i) ' ICI l'erreur
i = i + 1
End If
Next C
'--
"
Erreur d'exécution '451'
La procédure Property Let n'est pas définie et la procédure Property =
Get n'a pas renvoyé d'objet
"-
Merci.
En voulant afficher un Item d'un dictionnaire "dic", j'ai eu un message d'e=
rreur :
'
i = 1
Set dic = CreateObject("Scripting.Dictionary")
'-- On remplit le dictionnaire dic
For Each C In WS2.Range("F2:F" & LastLg)
If Not dic.Exists(C.Value) Then
dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Offset(=
0, -5).Value
MsgBox dic.Items(i) ' ICI l'erreur
i = i + 1
End If
Next C
'--
"
Erreur d'exécution '451'
La procédure Property Let n'est pas définie et la procédure Property =
Get n'a pas renvoyé d'objet
"-
Merci.
Pour te faciliter la tâche avec l'objet "Dictionary", charge la référence : "Microsoft
Scripting RunTime"
à partir de la barre des menus / outils / références (tu coches l'item énoncé) dans la
fenêtre de
l'éditeur de code.
Cela te permettra d'afficher la liste déroulante des objets... cela pourrait t'aider!
Et roule cette procédure :
Pour afficher les valeurs de cette ligne de code :
Debug.Print Dic.Keys(i) & ", " & Dic.Item(i + 1) & ", OU " & Dic(i + 1)
Tu dois ouvrir la fenêtre "Exécuter" dans le bas de la fenêtre de l'éditeur de code :
Raccourci clavier : Ctrl + G
Lorsque le code sera au point, tu peux décocher la bibliothèque et
modifier le code de cette manière :
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
et tu inhibes la ligne : Dim Dic As New Scripting.Dictionary
'--------------------------------------------
Sub test()
Dim i As Long
Dim Dic As New Scripting.Dictionary
'Set Dic = CreateObject("Scripting.Dictionary")
i = 0
For Each C In Sheet1.Range("F1:F9")
If Not Dic.Exists(C.Value) Then
Dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Value
Debug.Print Dic.Keys(i) & ", " & Dic.Item(i + 1) & ", OU " & Dic(i + 1)
i = i + 1
End If
Next C
End Sub
'--------------------------------------------
MichD
---------------------------------------------------------------
Ca donne une erreur sur cette ligne :
'-----------------
Dim Dic As New Scripting.Dictionary
'-----------------
"--
Type défini par l'utilisateur non défini
"---
comme énoncé dans la réponse donnée?
MichD
---------------------------------------------------------------
Oui, je l'ai coché dans le VBE.
J'ai ré-ouvert VBE et cocher la librairie, et l'erreur est disparu.
Maintenant, j'ai une autre erreur pour i=1 :
"-----
Cette clé est déjà associée à un élément de cette collection
"-----
Dans la ligne :
'---------------------------
Dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Value
'---------------------------
voir le module2
MichD
---------------------------------------------------------------
Je me suis contenté de reproduire ta procédure, mais la logique voudrait que
tu procèdes de cette manière :
La méthode "Exists" vérifie si la "Key" existe, en l'occurrence la valeur de la cellule C
Si elle n'existe pas, elle est ajoutée comme "Key" et l'item correspondant dans
c.offset(,5)
est ajouté à la des items.
'-------------------------------------------
Sub test()
Dim i As Long, C As Range, A As Long
Dim Dic As New Scripting.Dictionary
i = 0
For Each C In Sheet1.Range("F1:F9")
If Not Dic.Exists(C.Value) Then
Dic.Add Key:=C.Value, Item:=C.Offset(0, -5).Value
Debug.Print Dic.Keys(i) & ", " & Dic.Items(i)
i = i + 1
End If
Next C
End Sub
'-------------------------------------------
MichD
---------------------------------------------------------------
"Apitos" a écrit dans le message de groupe de discussion :
Salut,
J'ai ré-ouvert VBE et cocher la librairie, et l'erreur est disparu.
Maintenant, j'ai une autre erreur pour i=1 :
"-----
Cette clé est déjà associée à un élément de cette collection
"-----
Dans la ligne :
'---------------------------
Dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Value
'---------------------------
Bonjour,
Est-ce que c'est fait exprès qu'on n'ait pas le même indice entre la
clef et l'élément ?
En lisant les valeurs de clef dans A1:A9, est-ce qu'on ne court pas le
risque d'avoir deux fois la même ?
J'avoue que ça m'a bien intrigué cette histoire de clef déjà exis tante
sur un nouveau dictionnaire :)
Regarde le début de la procédure :
For Each C In Sheet1.Range("F1:F9")
If Not Dic.Exists(C.Value) Then
Dic.Add Key:=C.Value, Item:=C.Offset(0, -5).Value
Pour chaque contenu de chaque cellule de la plage F1:F9
Si le contenu de la cellule ne fait pas partie des keys de l'objet dictionnaire
il est ajouté. If Not Dic.Exists(C.Value) Then
L'objectif étant d'obtenir des valeurs uniques (Keys) dans le dictionnaire.
C'est habituellement la raison de base pourquoi, un usager fait appel à cet objet.
L'item ajouté peut avoir la même valeur que la clé du dictionnaire. Cela dépend de
l'objectif de l'usager.
MichD
---------------------------------------------------------------
[Ah, ce serveur avare en citations ...]
Oui, nous sommes bien d'accord.
Je me suis méfié que ça puisse être plus utile qu'on ne s'en rend e
compte de préciser dans quelle plage sont saisies les clefs de
dictionnaire, avant lancement du traitement. Là-dedans, il a pu y avoir
deux fois la même chose (14:40), ce qui t'a encouragé à insérer l e test
que tu dis (15:26).