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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichD
Le #24437761
Bonjour,

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
---------------------------------------------------------------
Apitos
Le #24438761
Bonjour Denis,

Ca donne une erreur sur cette ligne :

'-----------------
Dim Dic As New Scripting.Dictionary
'-----------------


"--
Type défini par l'utilisateur non défini
"---
MichD
Le #24438821
As-tu pris le temps de charger la référence : "Microsoft Scripting Runtime"
comme énoncé dans la réponse donnée?



MichD
---------------------------------------------------------------
Apitos
Le #24438851
As-tu pris le temps de charger la référence : "Microsoft Scripting Ru ntime"
comme énoncé dans la réponse donnée?



Oui, je l'ai coché dans le VBE.
Apitos
Le #24438861
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
'---------------------------
MichD
Le #24438891
Un fichier exemple ici : http://cjoint.com/?BDDo6m2XIkR
voir le module2



MichD
---------------------------------------------------------------
MichD
Le #24438921
Le "Key" dans les paramètres d'un dictionnaire doit avoir une valeur unique.

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
'---------------------------
Gloops
Le #24439451
MichD a écrit, le 29/04/2012 03:04 :
Dic.Add Key:=C.Offset(0, -5).Value, Item:=C.Value
Debug.Print Dic.Keys(i)& ", "& Dic.Item(i + 1)& ", OU "& D ic(i + 1)



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 :)
MichD
Le #24439481
Bonjour,

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
---------------------------------------------------------------
Gloops
Le #24439711
MichD a écrit, le 29/04/2012 21:08 :
[Ah, ce serveur avare en citations ...]
L'objectif étant d'obtenir des valeurs uniques (Keys) dans le diction naire.
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 dictionnair e. Cela dépend de
l'objectif de l'usager.


MichD
---------------------------------------------------------------




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).
Publicité
Poster une réponse
Anonyme