Variable dictionnaire ou tableau
Résolu
1Globule
Messages postés
62
Date d'inscription
Statut
Membre
Dernière intervention
-
1Globule Messages postés 62 Date d'inscription Statut Membre Dernière intervention -
1Globule Messages postés 62 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Vba dictionnaire plusieurs valeurs
- Télécharger dictionnaire larousse pdf gratuit - Télécharger - Dictionnaires & Langues
- Télécharger dictionnaire médical larousse gratuit pdf - Télécharger - Dictionnaires & Langues
- Dictionnaire synonyme gratuit - Télécharger - Études & Formations
- Télécharger dictionnaire informatique gratuit pdf - Télécharger - Bureautique
- Télécharger dictionnaire français gratuit pdf - Télécharger - Bureautique
5 réponses
Merci Patrice,
Effectivement, je n'y étais pas du tout...
Pourrais-tu m'éclairer sur ton code ?
Cette ligne : P(T(L, 1)) = T(L, 3) me semble signifier que :
P est le dictionnaire auquel on ajoute une clé (la ligne L, colonne 1) du tableau T.
Et la valeur associée à cette clé est égale à la ligne L, colonne 3 du tableau T.
Si c'est correct, comment dois-je faire pour récupérer plusieurs valeurs ?
J'ai besoin de la colonne 3, mais aussi de la 6 et de la 13, or il me semblait que les dictoinnaires ne supportaient qu'une valeur par clé.
Merci pour ton aide,
Effectivement, je n'y étais pas du tout...
Pourrais-tu m'éclairer sur ton code ?
Cette ligne : P(T(L, 1)) = T(L, 3) me semble signifier que :
P est le dictionnaire auquel on ajoute une clé (la ligne L, colonne 1) du tableau T.
Et la valeur associée à cette clé est égale à la ligne L, colonne 3 du tableau T.
Si c'est correct, comment dois-je faire pour récupérer plusieurs valeurs ?
J'ai besoin de la colonne 3, mais aussi de la 6 et de la 13, or il me semblait que les dictoinnaires ne supportaient qu'une valeur par clé.
Merci pour ton aide,
Bonjour,
Le plus rapide est d'utiliser des tableaux :
Le plus rapide est d'utiliser des tableaux :
Sub test() Dim P As Object Dim T, L&, D& With Worksheets("Temp") D = .Cells(.Rows.Count, 1).End(xlUp).Row T = .Range("A2:C" & D).Value End With Set P = CreateObject("Scripting.Dictionary") For L = LBound(T) To UBound(T) P(T(L, 1)) = T(L, 3) Next L With Worksheets("Produits") D = .Cells(.Rows.Count, 1).End(xlUp).Row T = .Range("A2:C" & D).Value For L = LBound(T) To UBound(T) T(L, 3) = P(T(L, 1)) Next L .Range("A2:C" & D).Value = T End With End Sub
Bonjour,
Effectivement, la ligne P(T(L, 1)) = T(L, 3), ajoute la clé du tableau T si elle n'existe pas et y associe l'item de la colonne 3. Si la clé existe, elle y associe le nouvel item.
Pour mémoriser 3 valeurs, plusieurs solutions se présentent, plus ou moins gourmandes en mémoire vive.
J'ai opté pour une des moins gourmandes : utiliser 4 tableaux et un dictionnaire en mettant les 3 valeurs dans l'item séparées par un séparateur spécial (hors caractères utilisables).
On aurait pu utiliser un seul tableau, le code serait plus simple mais cela mémorise de nombreuses colonnes inutilement.
Effectivement, la ligne P(T(L, 1)) = T(L, 3), ajoute la clé du tableau T si elle n'existe pas et y associe l'item de la colonne 3. Si la clé existe, elle y associe le nouvel item.
Pour mémoriser 3 valeurs, plusieurs solutions se présentent, plus ou moins gourmandes en mémoire vive.
J'ai opté pour une des moins gourmandes : utiliser 4 tableaux et un dictionnaire en mettant les 3 valeurs dans l'item séparées par un séparateur spécial (hors caractères utilisables).
Sub test() Dim P As Object Dim T1, T2, T3, T4, L&, D& ' definir les tableaux sources With Worksheets("Temp") D = .Cells(.Rows.Count, 1).End(xlUp).Row T1 = .Range("A2:A" & D).Value 'clé T2 = .Range("C2:C" & D).Value '1° valeur T3 = .Range("F2:F" & D).Value '2° valeur T4 = .Range("M2:M" & D).Value '3° valeur End With ' mémoriser les valeurs dans un dictionnaire Set P = CreateObject("Scripting.Dictionary") For L = LBound(T1) To UBound(T1) P(T1(L, 1)) = T2(L, 1) & Chr(1) & T3(L, 1) & Chr(1) & T4(L, 1) 'concatène les 3 valeurs dans le dictionnaire Next L ' restituer les valeurs With Worksheets("Produits") D = .Cells(.Rows.Count, 1).End(xlUp).Row T1 = .Range("A2:A" & D).Value 'clé T2 = .Range("C2:C" & D).Value 'colonne de destination de la 1° valeur (on pourrait changer de colonne) T3 = .Range("F2:F" & D).Value 'colonne de destination de la 2° valeur (on pourrait changer de colonne) T4 = .Range("M2:M" & D).Value 'colonne de destination de la 3° valeur (on pourrait changer de colonne) For L = LBound(T1) To UBound(T1) T2(L, 1) = Split(P(T1(L, 1)), Chr(1))(0) T3(L, 1) = Split(P(T1(L, 1)), Chr(1))(1) T4(L, 1) = Split(P(T1(L, 1)), Chr(1))(2) Next L .Range("C2:C" & D).Value = T2 'Ici on remet les valeurs en place .Range("F2:F" & D).Value = T3 ' " .Range("M2:M" & D).Value = T4 ' " End With End Sub
On aurait pu utiliser un seul tableau, le code serait plus simple mais cela mémorise de nombreuses colonnes inutilement.
Le code se complique :/
En tout cas il fonctionne très bien (je gagne plus d'une seconde juste sur cette partie).
Un tout petit souci : Si le produit n'existe pas dans la feuille Temp (ce qui ne devrait pas arriver, mais qui malheureusement arrive de temps en temps), j'ai un plantage (L'indice n'appartient pas à la sélection).
Est-ce qu'il pourrait renvoyer un #N/A, si possible ?
Si tu veux bien m'aider sur ce dernier point, et ensuite j'étudierais le code en détails pour récupérer des données qui se trouvent dans d'autres feuilles. A priori pas de date (ouf !).
Un grand merci en tout cas !
En tout cas il fonctionne très bien (je gagne plus d'une seconde juste sur cette partie).
Un tout petit souci : Si le produit n'existe pas dans la feuille Temp (ce qui ne devrait pas arriver, mais qui malheureusement arrive de temps en temps), j'ai un plantage (L'indice n'appartient pas à la sélection).
Est-ce qu'il pourrait renvoyer un #N/A, si possible ?
Si tu veux bien m'aider sur ce dernier point, et ensuite j'étudierais le code en détails pour récupérer des données qui se trouvent dans d'autres feuilles. A priori pas de date (ouf !).
Un grand merci en tout cas !
Remplaces :
Par :
For L = LBound(T1) To UBound(T1) T2(L, 1) = Split(P(T1(L, 1)), Chr(1))(0) T3(L, 1) = Split(P(T1(L, 1)), Chr(1))(1) T4(L, 1) = Split(P(T1(L, 1)), Chr(1))(2) Next L
Par :
For L = LBound(T1) To UBound(T1) If P.Exists(T1(L, 1)) Then T2(L, 1) = Split(P(T1(L, 1)), Chr(1))(0) T3(L, 1) = Split(P(T1(L, 1)), Chr(1))(1) T4(L, 1) = Split(P(T1(L, 1)), Chr(1))(2) Else T2(L, 1) = "#N/A" T3(L, 1) = "#N/A" T4(L, 1) = "#N/A" End If Next L
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci mille fois Patrice.
Ce code est parfait et très rapide. Je vais maintenant essayer de le transposer aux autres données que je dois récupérer.
Je place le sujet en Résolu, mais j'ai comme l'impression que j'aurais encore besoin d'aide sur les varaibles tableaux et dictionnaires (qui restent quand même un peu mystérieuses pour moi).
Merci encore.
Ce code est parfait et très rapide. Je vais maintenant essayer de le transposer aux autres données que je dois récupérer.
Je place le sujet en Résolu, mais j'ai comme l'impression que j'aurais encore besoin d'aide sur les varaibles tableaux et dictionnaires (qui restent quand même un peu mystérieuses pour moi).
Merci encore.