begin process at 2013 05 18 19:57:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Langages dérivés

 > 

VBA

 > 

Scripting.Dictionary


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club

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.

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales