Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Afficher un élément d'un dictionnaire

15 réponses
Avatar
Apitos
Bonsoir =E0 tous,

En voulant afficher un Item d'un dictionnaire "dic", j'ai eu un message d'e=
rreur :

'---------------------------------------------
i =3D 1
Set dic =3D CreateObject("Scripting.Dictionary")
=20
'-- On remplit le dictionnaire dic=20
For Each C In WS2.Range("F2:F" & LastLg)
If Not dic.Exists(C.Value) Then
dic.Add Key:=3DC.Offset(0, -5).Value, Item:=3DC.Offset(=
0, -5).Value
MsgBox dic.Items(i) ' ICI l'erreur
i =3D i + 1
End If
Next C
'-----------------------------------------------------

"------------------------------------
Erreur d'ex=E9cution '451'

La proc=E9dure Property Let n'est pas d=E9finie et la proc=E9dure Property =
Get n'a pas renvoy=E9 d'objet=20
"-------------------------------------

Merci.

10 réponses

1 2
Avatar
MichD
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
---------------------------------------------------------------
Avatar
Apitos
Bonjour Denis,

Ca donne une erreur sur cette ligne :

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


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



MichD
---------------------------------------------------------------
Avatar
Apitos
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.
Avatar
Apitos
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
'---------------------------
Avatar
MichD
Un fichier exemple ici : http://cjoint.com/?BDDo6m2XIkR
voir le module2



MichD
---------------------------------------------------------------
Avatar
MichD
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
'---------------------------
Avatar
Gloops
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 :)
Avatar
MichD
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
---------------------------------------------------------------
Avatar
Gloops
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).
1 2