Scripting.Dictionary

Résolu
Blek1 - 7 mars 2013 à 10:04
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 10 mars 2013 à 07:09
Bonjour,
Débutant et nouveau sur le forum, je sollicite votre aide.
Très faible en programmation, je suis parvenu à adapter un code pour mes besoins. j'ai eu beau chercher un tuto concernant cet outil mais je n'en ai pas trouvé. Les explications de l'aide Excel ne m'ont été d'une grande utilité vu mon niveau.

Avec ce code, je parviens à récupéré les données situées en colonne B de la feuille source vers les feuilles de destination en colonne A. Je voudrais en plus récupérer les données des colonnes F et G pour les mettre respectivement en colonnes B et C.
Sub essai3()
Dim bd As Object '(onglet BD)
Dim dico As Object '(DICtiOnnaire)
Dim dl As Integer '(Dernière Ligne)
Dim pl As Range 'PLage)
Dim cel As Range '(CELlule)
Dim temp As Variant '(tableau TEMPoraire)
Dim i As Integer '(Incrément)
Dim dics As Object 'DICtionnaireS)
Dim o As Object '(Onglet)
Dim teo As Variant '(tableau TEmporaire Outils)
Dim x As Integer 'variable x
Dim y As Integer 'variable y
Dim dercol As Integer '(Dernière colonne)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Set bd = Sheets("BD")
Set dico = CreateObject("Scripting.Dictionary")
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 
Set pl = bd.Range("B8:B" & dl) 'définit la plage pl

For Each cel In pl
    dico(cel.Value) = ""
Next cel
temp = dico.keys

For i = 0 To UBound(temp)
    Set o = Sheets(temp(i)) 'définit l'onglet o
    o.UsedRange.Clear
        
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i)
    
    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
        For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        dics(cel.Value) = "" 
    Next cel 'prochaine cellule de la boucle 2
    
    o.Range("A8").Resize(dics.Count) = Application.Transpose(dics.keys) 
     
    bd.Range("A1").AutoFilter 
Next i 
End Sub

Je vous remercie.

18 réponses

Bonjour,

En fin de compte mon mécanisme n'était pas aussi étrange que cela. Débutant, je me suis entêté à trouver une solution pour récupérer les données dans un tableau en utilisant le dictionnaire.
Malgré son utilisation, la solution était juste l'ajout d'un filtre sur la colonne D.
Voilà, mes feuilles seront rapidement renseignées, imprimées et transmises aux concernées. Quel soulagement, plus de gymnastique à faire.

J'ai consulté pas mal de discussions de ce forum pour cela, je voudrai rajouter deux choses aux intervenants de ce forum:

1- " Quand on veut, on peut. Sauf, si le problème dépasse les compétences de l’intervenant, alors qu'il s'abstienne d'intervenir dans une discussion."

2- " Que les intervenants ne fassent pas "miroiter", un soi-disant intérêt à une discussion en demande de plus amples éclaircissements pour finalement se dérober. Rassurez-vous, je n’utiliserai aucun qualificatif. "

Je vous rappelle que je suis nouveau au forum et, je vous avoue que je suis vraiment déçu.
3
Utilisateur anonyme
7 mars 2013 à 20:40
Bonjour,

Avec ce code, je parviens à récupéré les données situées en colonne B de la feuille source vers les feuilles de destination en colonne A. Je voudrais en plus récupérer les données des colonnes F et G pour les mettre respectivement en colonnes B et C.


Un dictionnaire c'est comme un tableau à deux dimensions. Cela contient une série de deux constituants; une clef qui qui doit être unique, et une valeur liée à la clef.

Tu n'as absolument pas besoin d'un dictionnaire pour déplacer/copier des données d'un endroit à un autre d'une feuille ou d'un classeur.

Pour le reste, je ne suis pas sur de comprendre ce que tu veux faire.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 mars 2013 à 22:01
Bonjour , cmarcotte,
C'est le troisième en moins de 10 jours qui passe inutilement par un dictionnaire. Et ce, apparemment sur la base d'un code trouvé sur internet (et dont l'objet devait être autre).
Ou comment se rendre de Paris à Barcelone en passant par Moscou !
J'en conclus que c'est une "épidémie" temporaire.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonsoir cmarcotte et ucfoutu,

D'après ce que j'ai lu, un dictionnaire était beaucoup plus rapide que les collections d'une part, d'autre on peut faire avec des transferts de données sans doublons. Débutant, c'est sur cette base que j'ai orienté mes recherches et récupérer quelques codes effectivement sur internet. J'apprends par l'exemple, à chacun sa méthode, à chacun son niveau académique.
comment se rendre de Paris à Barcelone en passant par Moscou !

Veuillez m'indiquer le plus court chemin. Hasard ou coïncidence, j'apprends que je ne suis le seul à avoir été séduit par cet objet.

Sur Excel, je m'en sort très bien par formule, seule difficulté quand le nombre de données de la colonne C change. Ceci implique l'ajout ou la suppression de 2 colonnes/données aux feuilles de destination.

Avec le code (plus haut), on transfère la colonne B sans doublons en colonne A sur les autres feuilles. je sais que c'est faisable pour les 2 autres colonnes (transfert des données correspondantes, comme les enregistrement d'une table). Le problème? je ne sais pas le faire.

Je pourrais joindre 5 images (ne dit-on qu'une image vaut mieux que de long discours).

En attendant vos réactions, pour le moment je vais dormir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mars 2013 à 07:08
Ce n'est que maintenant, que tu nous parles de doublons à écarter, ce qui justifierait alors en effet l'utilisation d'une collection ou d'un dictionnaire
Il n'est pas toujours vrai que l'utilisation d'un dictionnaire est plus rapide que celle d'une collection.

Si tu veux une aide efficace, il va sans aucun doute falloir que tu exposes clairement et complètement tes tenants et aboutissants.
Tu nous dis :
1)
on transfère la colonne B sans doublons en colonne A

et
2)
je sais que c'est faisable pour les 2 autres colonnes (transfert des données correspondantes, comme les enregistrement d'une table

or, :
- dans ton dictionnaire "dico", tu élimines donc les valeurs doublons d'une colonne
- dans ton dictionnaire "dics", tu élimines les doublons de valeurs d'une autre colonne
Drôle de logique, qui ferait qu'on ne saurait plus du tout ce qui correspond à quoi !
Je répète donc : exposé clair, précis et complet des tenants et aboutissants nécessaire. Tu dois être capable de l'exposer sans difficulté, si ta pensée est claire.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonjour,

j'ai délibérément simplifié le code, pourquoi?
Je répète donc : exposé clair, précis et complet des tenants et aboutissants nécessaire.


Dans ma première discussion, c'est ce que j'ai tenté de faire.
http://www.vbfrance.com/forum/sujet-TRANSFERE-DONNEES-DISPOSITION-SOURCE-DISPOSITIONS-DESTINATION-DIFFERENTES_1628753.aspx#5

Après avoir consulté pas mal de discussions (où vous y étiez bien présent), j'ai compris qu'il fallait poser une question à la fois (pas un projet,en bloc comme je l'avais fait).

Drôle de logique, qui ferait qu'on ne saurait plus du tout ce qui correspond à quoi !

Pourquoi, trouvez-vous cela drôle? Imaginez que vous extrayez d'une BD oracle, au format Excel et que l'on vous demande de l'exploiter avec un canevas imposé. La drôlerie est peut-être dans le canevas.
- dans ton dictionnaire "dico", tu élimines donc les valeurs doublons d'une colonne

Initialement, la macro créait les feuilles de destination en rapport à la colonne B. Dans mon projet, elles sont aux nombre de 4 et ne changeront jamais. J'ai supprimé cette partie du code et j'ai créé mes feuilles de destination une fois pour toute. Ce dico permet le transfert dans la feuille adéquate.
- dans ton dictionnaire "dics", tu élimines les doublons de valeurs d'une autre colonne

Celui-ci permet, le transfert sans doublons les données:
- de la colonne C en ligne dans les feuilles de destination, avec un saut de colonne (car pour chacune de ces données correspond 2 valeurs (col I et J) (une transposition colonne/ligne)
-de la colonne D vers col A dans les feuilles de destination.

Ainsi, je reconstitue le canevas imposé. Un tableau pour chacune des feuilles de destination:
- en col A ce qu'il y a en col B feuille BD
- en col B ce qu'il y a en col F feuille BD
- en col C ce qu'il y a en col G feuille BD
je voudrais donc sur la base de ce code utilisant le dictionnaire transférer les données des colonnes B et C.

* à partir de la col D c'est un autre histoire à traiter dans une autre discussion.

Ce sont les images des tenants et des aboutissants:
[ http://dl.free.fr/t3j2gapRU http://dl.free.fr/t3j2gapRU]
http://dl.free.fr/m5mGqFY3b
http://dl.free.fr/hz6Ue8Wor
http://dl.free.fr/rFvel1H9V
http://dl.free.fr/nalhJxbeO

Voici le code qui me reconstitue les tableaux des destination:
Sub essai2()
Dim bd As Object '(onglet BD)
Dim dico As Object '(DICtiOnnaire)
Dim dl As Integer '(Dernière Ligne)
Dim pl As Range 'PLage)
Dim cel As Range '(CELlule)
Dim temp As Variant '(tableau TEMPoraire)
Dim i As Integer '(Incrément)
Dim dics As Object 'DICtionnaireS)
Dim o As Object '(Onglet)
Dim teo As Variant '(tableau TEmporaire Outils)
Dim x As Integer 'variable x
Dim y As Integer 'variable y
Dim dercol As Integer '(Dernière colonne)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Set bd = Sheets("Consultation") 'définit l'onglet bd
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
'dico.AddItem
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet bd
Set pl = bd.Range("B8:B" & dl) 'définit la plage pl

For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon dans le tableau temp

For i = 0 To UBound(temp) 'boucle 1 : sur toutes les valeurs uniques du tableau temp
    Set o = Sheets(temp(i)) 'définit l'onglet o
    o.UsedRange.Clear 'efface les anciennes données
    o.UsedRange.MergeCells = False
    
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i) 'filtre automatique sur la colonne 2 (=B) avec la valeur temp(i) comme critère

    '''ENTETE LIGNE (6) DU TABLEAU'''

    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
    For Each cel In pl.Offset(0, 1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        dics(cel.Value) = "" 'alimente le dictionnaire dics
    Next cel 'prochaine cellule de la boucle 2
teo = dics.keys 'définit le tabeau teo
    
    ''DEBUT ENTETE DU TABLEAU 1ERE PARTIE
    
    o.Range("A6") = "Localisation"
    o.Range("A7") = "Localisation"
    
    o.Range("B6") = "Alimentation"
    o.Range("C6") = "Alimentation"
    
    o.Range("B7") = "Tension" & Chr(10) & "(Volt)"
    o.Range("C7") = "Courant" & Chr(10) & "(Ampère)"
       
    ''SUITE TABLEAU EXTRAITE DE LA BD''''''''''''''''''''
        y = 2 'initialise la variable y
    For x = 0 To UBound(teo) 'boucle 3 : sur toutes les outils (sans doublon)
        o.Cells(6, y + 2).Value = teo(x) 'place l'outil dans le tableau
        o.Cells(6, y + 2).Offset(, 1).Value = teo(x) 'place l'outil dans le tableau
        
        o.Cells(7, y + 2).Value = "Potentiel" & Chr(10) & "(mV)"
        o.Cells(7, y + 2).Offset(, 1).Value = "Courant" & Chr(10) & "(mA)"
    y = y + 2 'incrément y
        
        'o.Cells(7, y + 2).Offset(-1, 0).Offset(1, 0).Value = "Direction"
        'o.Cells(7, y + 3).Offset(-1, 0).Value = "Observations"
     
     ''FIN entete ligne DU TABLEAU'''''''''''''''''''''''
     dercol = o.Range("A6").End(xlToRight).Column
     o.Cells(6, dercol + 1).Value = "Observations"
     'o.Cells(6, dercol + 1).Offset(, 1).Value = "Direction"
     o.Cells(7, dercol + 1).Value = "Observations"
     'o.Cells(7, dercol + 1).Offset(, 1).Value = "Direction"
    
    Next x 'prochain outil de la boucle 3

    '''ENTETE COLONNE (A) DU TABLEAU'''''''''''''''''''''''''''
       
    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
        For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        'dics(cel.Value) = "" 'alimente le dictionnaire dics
        dics.Item(cel.Value) = dics.Item(cel.Value) '^^^^^^^^^^^^^^^^^^^^^^
    Next cel 'prochaine cellule de la boucle 2
    
    o.Range("A8").Resize(dics.Count) = Application.Transpose(dics.keys) 'renvoie en colonne à partir de A2 la liste des outils sans doublons
     
     bd.Range("A1").AutoFilter 'annule le filtre automatique
Next i 'prochaine valeur de la boucle 1
End Sub


Je vous remercie pour attention et votre aide.

Bonne journée!
0
Rebonjour,

Les images montrent le résultat final, rien ne vous obligent à le traiter dans sa globalité. Ne traiter donc que la partie des colonnes A, B et C des feuilles de destination. Ces données se trouvent respectivement dans la feuille source en colonnes B, F et G.

En vous remerciant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mars 2013 à 10:29
Personnellement, je m'arrête à ceci :
Pourquoi, trouvez-vous cela drôle?

qui n'appelle qu'un peu de réflexion (au besoin avec, en mains, un papier et un crayon).
Je ne reviendrai qu'après cette réflexion, qui, elle, n'a besoin d'aucune connaissance en matière de développement.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Je déduis que vous n'êtes pas arrivé à ceci:
Pourquoi, trouvez-vous cela drôle? Imaginez que vous extrayez d'une BD oracle, au format Excel et que l'on vous demande de l'exploiter avec un canevas imposé. La drôlerie est peut-être dans le canevas.


ce canevas est imposé. On s'en tient là!

Je constate que vous m'avez fait perdre mon temps.

Merci, pour la participation.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mars 2013 à 12:04
ce canevas est imposé. On s'en tient là!

Ce n'est pas le canevas, qui est mis en cause, mais le mécanisme étrange et pour le moins aléatoire !
Réflexion non faite ou très "légère", apparemment.
Je te laisse là.
Bonne chance

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2013 à 16:51
Désolé que tu aies été "déçu", mais :
lorsque j'appelle l'attention sur l'impasse dans laquelle on s'engouffre avec deux dictionnaires distincts et qu'on insiste, je ne me "dérobe" pas, mais cesse de participer.
Je ne sais pas ce que tu as finalement fait exactement avec "une colonne D", mais sais simplement qu'aucun dictionnaire n'était nécessaire pour parvenir à un résultat sans faille et sans doublons. Et c'est ce à quoi nous serions parvenus (et de manière agile) si tu ne t'étais pas entêté dans ton mécanisme que je ne voulais (et pour cause) absolument pas suivre.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
9 mars 2013 à 17:46
Pourquoi utiliser un dictionnaire inutile dans ce cas là,
et c'est certainement moins rapide en cas de gros volume à traiter.

La génération actuelle experte en copier / coller en oublie de commencer par une conception réfléchie,
le nerf de toute programmation réussie …

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
0
Message bien reçu. J'ai bien compris maintenant que tu cesses de participer dès que les mécanismes ne répondent pas à ta logique. je me suis rendu compte que tu n'avais même pas pris la peine de jeter un coup d’œil à mon code (il contenait une petite erreur), on ne s'en rend compte qu'à l’exécution pas à pas.

Si je me suis entêté, c'est dans le but de comprendre le fonctionne d'un dictionnaire. Par contre, toi tu voulais m'emmener où tu voulais sans même le proposer.

J'avoue que sans l'aide de mon neveu, je n'y serai pas parvenu (il avait fait quelques modules de VBA à la fac).
Je ne sais pas ce que tu as finalement fait exactement avec "une colonne D"

Si ça t’intéresses, je peux mettre le code juste pour voir ce qu'on a fait avec la colonne D.
Si tu veux une aide efficace, il va sans aucun doute falloir que tu exposes clairement et complètement tes tenants et aboutissants.
Je ne reviendrai qu'après cette réflexion, qui, elle, n'a besoin d'aucune connaissance en matière de développement.

Tu m'as fait travailler très tard pour rédiger et faire des images pour "t"exposer les tenants et les aboutissants", le plus explicitement possible. Pour qu'à la fin, vous me faites en quelque sorte du chantage.
Quelle différence y a-t-il entre se dérober et cesser de participer?

Je me permets de vous dire cher monsieur, j'ai consulté beaucoup de discussions auxquelles vous avez participé, que vous êtes aussi entêté que moi ou si ce n'est plus.
0
Bonjour MarcPL,

c'est effectivement, un gros fichier extrait d'une BD oracle ancienne version, sous format Excel.

Je vous remercie, mon problème est résolu.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2013 à 18:35
Bien. Comportement enregistré dans ma mémoire pour l'avenir, donc.
Et si tu avais simplement voulu apprendre l'utilisation d'un dictionnaire, il fallait le demander, mais, alors, sans même parler de ton appli. Tu aurais eu un exemple totalement indépendant, hein !
Allons allons !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Comportement enregistré dans ma mémoire pour l'avenir, donc.

et que dire de ton comportement?
tu m'as fait croire que tu allais me donner un coup de main. tu me fais veiller très tard et ensuite tu me laisses tomber. il ne fallait pas faire ça. javais bien expliquer que c'était pour aider de bons copains que je faisais ça (dans ma première discussion et pour te faire rappeler je t'ai mis le lien).
si tu avais simplement voulu apprendre l'utilisation d'un dictionnaire, il fallait le demander

Encore une dérobade.
En pensant à mes copains, je m'était dit super, enfin quelqu'un pour me donner un coup de main. ils vont être contents. Je ne m'attendais pas à ce revirement.
Enfin, pour l'avenir. Moi aussi, j'ai enregistré dans ma petite mémoire de supprimer dès ce soir vbfrance de mes favoris.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2013 à 19:27
Je ne vais pas m'en remettre.
Bonne chance ailleurs.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 mars 2013 à 07:09
Tiens ! C'est marrant de découvrir à quel point se réveiller tôt le dimanche matin permet d'y voir très clair.
A moins que ce ne soient tout simplement : le même style, les mêmes formulations, les mêmes comportements, les mêmes difficultés à exposer clairement, etc ... etc ... Mais surtout : les mêmes artifices pour "tirer les vers du nez" (traduire : faire faire son travail par d'autres, peu à peu).
Ce n'est donc probablement pas seulement toi, Blek1, qui nous dis adieu, mais également ton jumeau, non ?
Je corrige donc juste pour le cas où ... :
Bonne chance ailleurs

par
Bonne chance ailleurs à vous deux.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous