IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

dictionnaire et utilisation des clés


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut dictionnaire et utilisation des clés
    Bonjour tous le monde!
    J'ai des difficultés avec l'utilisation du dictionnaire pour vba.
    En fait mon but est d'appliquer des instructions sur chaque valeur trouvée et pas de les afficher dans une liste.


    J'ai essayé avec un Scripting.Dictionary :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_Initialize()
      Set f = Sheets("feuil1")
      Set p = Sheets("feuil2")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)     ' tableau a(n,1) 
      For i = LBound(a) To UBound(a)
         If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
        If mondico.keys = p.Range("A & i") Then Range("B & i") = p.Range("B & i")
      Next i
        End Sub
    mais j'arrive pas à manipuler les clé générées... Je m'explique:
    Si la 1ère clé générée (à partir de l'analyse des données) correspond à une valeur qui se trouve une colonne A, alors copier sa valeur associée (qui se trouve dans la colonne B) dans la cellule (i,1) d'une autre feuille.

    Nom : exemple.jpg
Affichages : 4818
Taille : 25,6 Ko

    C'est pourquoi j'ai essayé différents codes comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If mondico.keys = p.Range("A & i") Then Range("B & i") = p.Range("B & i")
    Merci d'avance si quelqu'un peut me donner un conseil!

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    Ce que tu veux faire n'est pas très clair!
    Mais il me semble que tu n'utilises pas la collection keys correctement.
    Avec l'expression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If mondico.keys = p.Range("A & i")
    tu ne parcourt pas cette collection des clés.
    Tu compares le tableau retourné par mondico.keys avec le valeur retourné par p.Range("A & i").
    Cette syntaxe n'est pas correcte.
    Pour plus d'info sur l'utilisation du dictionnaire, voir:
    http://boisgontierjacques.free.fr/
    Hth,

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut
    Bonjour,

    Merci pour le lien! Effectivement kk1 d'autre me l'a conseillé et il est très intéressant donc je regarde ce que je peux faire merci!
    Pour préciser mon but, sur l'image que j'ai envoyé dans le poste précédant:
    On a une liste de données en feuil1 (colonne A).
    1/ Avec le dictionnaire je vais créer une liste sans doublon (en mémoire vive si j'ai bien compris).

    2/ Ensuite je compare cette liste (qui correspond donc aux valeurs possibles trouvées en feuil1) à la colonne A d'une deuxième feuille (feuil 2) et pour chaque correspondance je récupère la valeur de la cellule associée .offset(0,1).

    3/ Je veux pouvoir par exemple copier ces valeurs associées dansune troisième feuille.


    Si quelqu'un peux m'aider merci d'avance!!

  4. #4
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut solution cadeau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub Cadoooooo()
        Dim AllRange As Range, MyRange As Range
        Dim MyDico as new dictionary      
        With ThisWorkbook.Worksheets("Sheet1")
     
            'Tu nome le range de départ
            Set AllRange = .Range(.Range("FirstP"), .Range("FirstP").End(xldown))
            For Each MyRange In AllRange
     
                If Not MyDico.Exists(MyRange.value) Then
                    MyColProd.Add MyRange.value, MyRange.value
                End If
            Next MyRange
        End With
    End Sub

    La tu as un dico avec les valeurs, meme si c'est un peu inutile s'achante qu'il ne sert qu'a avoir l'unicité..., mais bon ca repond a ce que tu veux

    Ensuite code qui parcours la feuille deux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub Cado2(byval MyDico as dictionary)
        Dim AllRange As Range, MyRange As Range 
        Dim MyVect(), i as long   
        With ThisWorkbook.Worksheets("Sheet2")
     
            'Tu nome le range de départ (c'est tjs plus propre)
            Set AllRange = .Range(.Range("SecondP"), .Range("SecondP").End(xldown))
            For Each MyRange In AllRange
     
                If MyDico.Exists(MyRange.value) Then
                    Redim preserve MyVect(i)
                    MyVect(i) = MyRange.offset(,1).value
                    i=  i+1
                End If
            Next MyRange
        End With
     
        With thisworkbook.worksheets("Sheet3")
               .range("A1").Resize(UBound(MyVect) + 1, 1) = Application.Transpose(MyVect)
     
        end with
    End Sub
    Petite precision ici un resize(ubound(vect)+1,1): on retaille le range eavec un nbre de ligne egal à la premiere dimension du vecteur (nombre de valeur qui est dans le dictionnaire et on ajoute 1 car la dimension du vect commence à 0 et non à 1 . ( si tu veux indicer tes vecteurs à partir de 1 tu mets un option base 1 en haut apres le option explicit .
    Deuxieme chose application. transpose car par definition un vecteur(i), est un vecteur ligne, alors que toi c'est plutot un vecteur colonne que tu veux vu que tu parcours une colonne , mais comme c'est vba qui a le dernier mot, et bein c'est quand meme vecteur ligne lol. Donc tu nous fait un petit traspose, qui va transformer ta ligne en colonne ( et vice versa dailleurs). Voila normalement ca va marcher, j'aii pas testé j'écris ca un peu comme ca mais si y'a un bug et bien on voi ca demain .

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 71
    Par défaut
    Re,

    Merci bcp pour ton aide tamtam64! Je vais regarder tout ça et essayer de comprendre avant de faire un retour!


  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut
    Pas de problème par contre clairement si c'est un truc optimal que tu veux c'est pas forcement la bonne solution que d'utiliser un dictionnaire .
    Mais si c'est pour t'entrainer c'est un trés bon exo , moi j'ai commencé comme ca faire des trucs inutiles lol.

    Donc pour tester l'unicité clairement tu as les formules tableau de excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Match() et un offset et op le tour est joué :) demain si j'ai le temps je te passe la formule
    Encore une fois ca depend dece que tu veux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Utilisation des clés de Dictionary dans une variable tableau
    Par pijaku dans le forum Contribuez
    Réponses: 1
    Dernier message: 22/02/2012, 22h05
  2. Problème d'utilisation des clés registre
    Par estacado dans le forum C#
    Réponses: 2
    Dernier message: 12/08/2009, 08h39
  3. SSHproxy et l'utilisation des clés privées
    Par eb4la dans le forum Réseau
    Réponses: 0
    Dernier message: 25/06/2009, 18h21
  4. Optimisation et utilisation des clés étrangères
    Par CinePhil dans le forum Optimisations
    Réponses: 22
    Dernier message: 07/05/2008, 21h24
  5. [Access2003][VBA]Utilisation des Dictionnaires
    Par hoaxpunk dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 21h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo