XL 2010 [RESOLU] Alimenter Dictionnaire clé+item

cathodique

XLDnaute Barbatruc
Bonjour,

Après des recherches infructueuses. Je m'en remets aux connaisseurs.
En colonne A des clés (numériques et alphabétiques) et en B les items. Comment récupérer dans un dictionnaire, les clés (numériques seulement) et les items correspondants. Pas très copain avec Dictionary, ça coince où?
VB:
Sub essai()
  a = [A1:B8]
  Set dic1 = CreateObject("scripting.dictionary")
  For Each c In a
    If IsNumeric(c) Then
    dic1(c) = c.value, dic1(c)=c.offset(,1).value) '****Plante ici
    End If
  Next c
  [E2].Resize(dic1.Count) = Application.Transpose(dic1.keys)
  [D2].Resize(dic2.Count) = Application.Transpose(dic1.Items)
End Sub
En vous remerciant par avance.
 

Bougla972

XLDnaute Occasionnel
Bonjour Cathodique,

Comme ceci:
VB:
Sub essai()
Dim a
Dim i As Integer
Dim Dic1 As Object

  a = [A1:B8]
  Set Dic1 = CreateObject("scripting.dictionary")
  For i = 1 To UBound(a)
    If IsNumeric(a(i, 1)) Then
        Dic1(a(i, 1)) = a(i, 2) ' '****Plante ici
   End If
  Next i
  [E2].Resize(Dic1.Count) = Application.Transpose(Dic1.keys)
  [D2].Resize(Dic1.Count) = Application.Transpose(Dic1.Items)
End Sub
 

cathodique

XLDnaute Barbatruc
Merci beaucoup Bougla972:),

C'est super, ça fonctionne. Franchement, rien compris à l'alimentation des dictionnaire.
Tu es passé par un array (je voulais boucler sur la feuille pour m'exercer), pas de souci.
Mais ce que je ne comprends pas encore sont les différentes façons d'alimenter le dictionnaire.
Je n'ai pas encore trouvé un tuto vraiment explicite.
Je consulte très souvent le site de Boisgontier (très fourni en exemples), mais je n'y perds.
Dés fois c'est Dic1(a(i, 1)) = "" ici c'est juste la clé alors qu'on met ="" (pas compris):(.

Merci beaucoup pour ton aide. Je dois revoir tout ça.

Bonne journée.
 

thebenoit59

XLDnaute Accro
Merci beaucoup Bougla972:),

C'est super, ça fonctionne. Franchement, rien compris à l'alimentation des dictionnaire.
Tu es passé par un array (je voulais boucler sur la feuille pour m'exercer), pas de souci.
Mais ce que je ne comprends pas encore sont les différentes façons d'alimenter le dictionnaire.
Je n'ai pas encore trouvé un tuto vraiment explicite.
Je consulte très souvent le site de Boisgontier (très fourni en exemples), mais je n'y perds.
Dés fois c'est Dic1(a(i, 1)) = "" ici c'est juste la clé alors qu'on met ="" (pas compris):(.

Merci beaucoup pour ton aide. Je dois revoir tout ça.

Bonne journée.

Bonjour Bougla, Cath.

Pour répondre à ton incompréhension concernant le = "", c'est juste pour ne pas assigner d'item à cette clef, parfois tu n'en as pas besoin, donc on évite d'encombrer les variables de données inutiles.

Passer par un array comme Bougla le fait est une des meilleures solutions pour gagner en temps d'exécution, et c'est ce que tu fais également dans ton code.

Juste pour reprendre ton code et le corrgier :
VB:
Sub essai2()
Dim a As Range
  Set a = [A1:A8] 'Sinon tu boucleras sur la colonne B également.
  Set dic1 = CreateObject("scripting.dictionary")
  For Each c In a
    If IsNumeric(c) Then
    dic1(c) = c.Offset(, 1).Value 'Valeur c en clé et la valeur de droite en item.
   End If
  Next c
  [D2].Resize(dic1.Count) = Application.Transpose(dic1.keys)
  [E2].Resize(dic1.Count) = Application.Transpose(dic1.Items) 'Erreur également ici tu avais mis dic2.count mais tu n'en as pas.
End Sub
 

Si...

XLDnaute Barbatruc
Bonjour

une petite remarque : on peut avoir aussi une erreur avec des cellules vides. @tester

VB:
Sub essai1()
  Dim C As Range, Dico
  [D2:E9] = ""   ‘préventif en cas de changement dans la plage
  Set Dico = CreateObject("scripting.dictionary")
  For Each C In [A1:A8]
  If IsNumeric(C) And C <> "" Then Dico(C) = C(1, 2)    'clé (C pas vide) et item(voisin de droite)
  Next
  [D2].Resize(Dico.Count) = Application.Transpose(Dico.keys)  'clés
  [E2].Resize(Dico.Count) = Application.Transpose(Dico.Items)   'items
End Sub
 

cathodique

XLDnaute Barbatruc
Bougla972, Thebenoit59, Si...;)

Messieurs, je vous remercie pour vos explications et vous codes. ça me sera d'une grande utilité,
j'en suis persuadé. Je dois reprendre mes grossières lacunes.

Dès fois ça jailli tout seul sans forcer, mais dès fois j'avoue ça coince, jusqu'au handicap.

Encore Merci, un grand merci à vous.

Bonne fin d'après-midi.
 

klin89

XLDnaute Accro
Bonsoir à tous,:)

Pour bien comprendre, ici on emploie la propriété Item du dictionnaire pour ajouter une clé et y associer son élément
Code:
Dico(C.value)    est l'équivalent de    Dico.Item(C.Value)
VB:
For Each C In [A1:A8]
        If IsNumeric(C.Value) And C.Value <> "" Then Dico.Item(C.Value) = C(1, 2).Value
        'If IsNumeric(C) And C <> "" Then Dico(C) = C(1, 2)
  Next
Sinon tu peux employer la méthode add
VB:
If IsNumeric(C.Value) And C.Value <> "" Then Dico.Add C.Value, C(1, 2).Value
Code:
Dico.Item(C.Value) = C(1, 2).Value    est l'équivalent de   Dico.Add C.Value, C(1, 2).Value
Attention toutefois aux doublons, ici cela bugguera, il faut employer la méthode Exists
Dernier point : avez vous testé ceci en présence de doublons :confused:
VB:
If IsNumeric(C) And C <> "" Then Dico(C) = C(1, 2)
puis cela
VB:
If IsNumeric(C.Value) And C.Value <> "" Then Dico(C.Value) = C(1, 2).value
Y'a pas quelque chose qui cloche :eek:
En résumé, attention au contexte.

klin89
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour Klin89:);)

Je te remercie infiniment pour ce petit tutoriel. C'est un peu plus clair dans ma petite tête.
Je vais copier ceci dans un fichier dédié au Dictionnaire et surtout m'exercer pour bien assimiler ce concept très utile.
Encore une question si tu permets. Dans tes exemples, je ne vois pas de clé (key). En fait, c'est un peu brouillon dans ma caboche, cette histoire de clé et item. Même l'aide n'est pas très explicite voici ce qui est donné:
VB:
Dim d  'Crée une variable Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athènes" 'Ajoute des clés et des éléments
d.Add "b", "Belgrade"
d.Add "c", "Le Caire"
dans cet exemple, j'ai compris qu'on ajoute par exemple une clé 'a' à laquelle est lié un item 'Athénes'.
Mais à partir d'une feuille, pratiquement tous les codes que j'ai pu trouver sur le net, le 'key' ne s'y trouvait pas. Alors que c'est bien avec le 'key' que le dictionnaire est alimenté.

Un grand merci.

Bonne fin de semaine et bon week-end.
 
Dernière édition:

klin89

XLDnaute Accro
re cathodique :)

Ici on utilise la propriété Item du dictionnaire
dico.JPG


Que fait cette instruction :
elle ajoute la clé (si elle n'existe pas) et y associe son élément (item)

klin89
 

Pièces jointes

  • dico.JPG
    dico.JPG
    12.4 KB · Affichages: 25
Dernière édition:

Statistiques des forums

Discussions
312 487
Messages
2 088 823
Membres
103 971
dernier inscrit
abdazee