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
'-----------------------------------------------------
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 '--------------------------------------------
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
'--------------------------------------------
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 '--------------------------------------------
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 "-----
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 :
3875363.1364.1335703258796.JavaMail.geo-discussion-forums@yncd3...
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
"-----
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 "-----
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
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.
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.
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 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.
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).
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.
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).
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.
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).