Accueil > Forum > > > > Scripting.Dictionary
Scripting.Dictionary
jeudi 7 mars 2013 à 10:04:37 |
Scripting.Dictionary

Blek1
|
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.
Code Visual Basic : 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.
|
|
jeudi 7 mars 2013 à 20:40:10 |
Re : Scripting.Dictionary

cmarcotte
|
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.
|
|
jeudi 7 mars 2013 à 22:01:34 |
Re : Scripting.Dictionary

ucfoutu
|
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.
|
|
vendredi 8 mars 2013 à 01:31:11 |
Re : Scripting.Dictionary

Blek1
|
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.
|
|
vendredi 8 mars 2013 à 07:08:00 |
Re : Scripting.Dictionary

ucfoutu
|
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.
|
|
vendredi 8 mars 2013 à 10:11:58 |
Re : Scripting.Dictionary

Blek1
|
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
[ Lien ]
[ Lien ]
[ Lien ]
[ Lien ]
Voici le code qui me reconstitue les tableaux des destination:
Code Visual Basic : 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!
|
|
vendredi 8 mars 2013 à 10:24:33 |
Re : Scripting.Dictionary

Blek1
|
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.
|
|
vendredi 8 mars 2013 à 10:29:06 |
Re : Scripting.Dictionary

ucfoutu
|
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.
|
|
vendredi 8 mars 2013 à 11:57:04 |
Re : Scripting.Dictionary

Blek1
|
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.
|
|
vendredi 8 mars 2013 à 12:04:07 |
Re : Scripting.Dictionary

ucfoutu
|
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.
|
|
Cette discussion est classée dans : bd, range, cel, pl, dics
Répondre à ce message
Sujets en rapport avec ce message
Récupérer données lignes visibles [ par scribetout ]
Bonjour, J'ai besoin de votre aide pour une correction de code. Sur une feuille "BASE", j'applique un filtre conditionnel et récupère les données sur
mélange Range, cells et if else [ par scribetout ]
Bonjour, [code=vb]For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) Set dest = IIf(o.Range("A7").Value = "", o.Range("A7")
Décalage surlignage [ par melinette35 ]
Bonjour, suite à un nouveau problème haut en couleur, je reviens vers vous. Je cherche à surligner dans le fichier referenceX les lignes qui sont par
Incompatibilité de type [ par RoverMan ]
Bonjour tout le monde, Je m'arrache les cheveux depuis plusieurs jours à essayer de comprendre pourquoi mon code ne fonctionne pas. Dans ce que je v
additionner des cellules contenues dans une plage dont la taille varie tous les jours (vba excel) [ par drine des iles ]
Bonjour, j'ai un problème avec ce code VBA pour Excel que jpleroisse (un ou une développeur) m'a trés gentillement transmis.Ce code est censé permettr
Copier une plage en ignorant les cellules vides [ par gerardmireille ]
[b][/b]Bonjour, Je tente vainement de recopier un plage de cellule d'une feuille à l'autre en ignorant les cellules vides mais sans affecter l'ordre
Correction bug dans mon code [ par stepaustral ]
Bonjour à toutes et à tous, Voilà j'ai un fichier excel dont j'ai une erreur 1004 qui se produit quand une certaine page n'a pas été trouvée et donc
Problème lors du double clilc dans une listview [ par laurentnove ]
Bonjour à tous, Je viens vers vous aujourd'hui pour m'aider à solutionner un problème sur un programme que je finalise. Je traite une base de donnée
Améliorer une macro [ par cocomyam ]
Bonjour,J'ai trouvé cette fonction sur internet et elle marche mais pas tout le temps. En fait elle ne se rafraichit pas automatiquement quand on colo
Livres en rapport
|
Derniers Blogs
CONF'SHAREPOINT : 10 BONNES RAISONS POUR NE PAS LA RATERCONF'SHAREPOINT : 10 BONNES RAISONS POUR NE PAS LA RATER par pierre
Si vous hésitez encore à venir à la conférence, ci-après 10 bonnes raisons pour ne pas rater cet évènement unique : La Conf'SharePoint, c'est la 1ère conférence en France et en Français dédié à SharePoint : pas de barrière de la langue La Conf...
Cliquez pour lire la suite de l'article par pierre [EVENT] SOIRéE DE LANCEMENT AGILE .NET FRANCE à LYON[EVENT] SOIRéE DE LANCEMENT AGILE .NET FRANCE à LYON par thavo
Agile.Net France débarque à Lyon fin juin !! Je viens d'arriver à Lyon, et l'Agile .Net France aussi. Pour ceux/celles qui habitent en Rhône-Alpes, seriez-vous disponible pour une soirée « Agile .Net France » ?? (je sais que certains vi...
Cliquez pour lire la suite de l'article par thavo SHAREPOINT : INCOMPATIBILITé AVEC INTERNET EXPLORER 10 (IE10)SHAREPOINT : INCOMPATIBILITé AVEC INTERNET EXPLORER 10 (IE10) par ROMELARD Fabrice
Depuis plusieurs mois, Microsoft a publié un patch (comme très régulièrement) qui est passé relativement inaperçu à l'époque. L'arrivée de plus en plus de postes sous Windows 8 et surtout le déploiement par Windows Update de ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice AUTOSPINSTALLER POUR SHAREPOINT 2013 MAINTENANT DISPONIBLE EN "RTM"AUTOSPINSTALLER POUR SHAREPOINT 2013 MAINTENANT DISPONIBLE EN "RTM" par neodante
Alors qu'il n'était qu'en Beta et que quelques dysfonctionnements persistaient, la nouvelle version du fabuleux script AutoSPInstaller permettant d'installer SharePoint 2010/2013 en full script (idéal pour répliquer des fermes de dev/qual/prod) est mainte...
Cliquez pour lire la suite de l'article par neodante
Logiciels
Devis-Factures PHMSD (2.1.0.1)DEVIS-FACTURES PHMSD (2.1.0.1)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD Ludoprêt (3.2)LUDOPRêT (3.2)Logiciel gratuit de gestion de ludothèque.
Gestion des jeux et des adhérents.
Gestion des for... Cliquez pour télécharger Ludoprêt Revealer Keylogger Free (2.05)REVEALER KEYLOGGER FREE (2.05)Keylogger invisible et gratuit pour Windows 8, 7, Vista ou XP. Revealer Keylogger Free vous perme... Cliquez pour télécharger Revealer Keylogger Free 974 Application Server (13.2.1.3)974 APPLICATION SERVER (13.2.1.3)Ecommerce, Blogueur, Vitrine, Newsletter, Java IDE, ..., in the cloud et sous haute dispo. Facile... Cliquez pour télécharger 974 Application Server WDmemoCode (1.0.0)WDMEMOCODE (1.0.0)WDmemoCode a été créé pour aider les développeurs Windev à créer/compléter et conserver une base ... Cliquez pour télécharger WDmemoCode
|