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 :

Utilisation d'un dictionary [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut Utilisation d'un dictionary
    Bonjour,
    j'ai une chtite question sur les dictionary
    Je ne comprends pas pourquoi un de mes codes ne marche pas

    voici la partie commune
    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
    Public Dico As Scripting.Dictionary
    Sub Main()
        Call Calcul
        Call Affiche
    End Sub
    Sub Calcul()
    i = 2
    If Not Dico Is Nothing Then
        Set Dico = Nothing
    End If
    Set Dico = CreateObject("Scripting.Dictionary")
    While ThisWorkbook.Sheets("Champs").Cells(i, 1) <> ""
        Dico.Add ThisWorkbook.Sheets("Champs").Cells(i, 1), Int(14 * Rnd())
        i = i + 1
    Wend
    End Sub
    Voici la macro Affiche qui marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Affiche()
    i = 2
    Do While ThisWorkbook.Sheets("Champs").Cells(i, 1) <> ""
        For Each Element In Dico
            If Element = ThisWorkbook.Sheets("Champs").Cells(i, 1) Then
               MsgBox Dico.Item(Element)
               Exit For
            End If
        Next
        i = i + 1
    Loop
    End Sub
    Et voila la macro Affiche qui ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Affiche()
    i = 2
    Do While ThisWorkbook.Sheets("Champs").Cells(i, 1) <> ""
        MsgBox Dico.Item(ThisWorkbook.Sheets("Champs").Cells(i, 1))
        i = i + 1
    Loop
    End Sub
    Quelqu'un sait pourquoi? Ca vient d'un format?
    Si ca ne marche vraiment pas, quelq'un connait un objet autre que Dictionnary qui permet de faire cela?
    Merci d'avance

  2. #2
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonsoir -={-_-}=- le forum
    en CreateObject("Scripting.Dictionary") je declarais en tant object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim dico As objet
    Set dico = CreateObject("Scripting.Dictionary")
    ou une collection !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim dico  As Collection
    Set dico = New Collection
    pour le reste la finalite de ton code c' est quoi???
    SALUTATIONS

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Bonjour

    L'objet Dictionnary accepte "n'importe quoi" comme Key.

    Dans la procédure qui alimente le dictionnaire, tu passes des cellules comme Key et pas des valeurs. (C'est le problème de VBA qui interprète ce que tu passes comme valeur et qui détermine à sa sauce le type de valeur/objet que tu lui passes).

    Tu dois donc modifier tes deux procédures.
    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 Calcul()
    Dim i As Integer
    i = 2
    If Not Dico Is Nothing Then
        Set Dico = Nothing
    End If
    Set Dico = CreateObject("Scripting.Dictionary")
    While ThisWorkbook.Sheets("Champs").Cells(i, 1) <> ""
        Dico.Add ThisWorkbook.Sheets("Champs").Cells(i, 1).Value, Int(14 * Rnd())
        i = i + 1
    Wend
    End Sub
     
    Sub Affiche()
    Dim i As Integer
     
    i = 2
    Do While ThisWorkbook.Sheets("Champs").Cells(i, 1) <> ""
        MsgBox Dico.Item(ThisWorkbook.Sheets("Champs").Cells(i, 1).Value)
        i = i + 1
    Loop
    End Sub
    En ajoutant.value à ThisWorkbook.Sheets("Champs").Cells(i, 1), tu forces le dictionnaire à prendre la valeur comme clé et non l'objet Cellule. Ton code fonctionnera alors sans problème...

    Remarques:
    1) N'hésite pas à utiliser la déclaration obligatoire des variables (option explicit au début du module (et Outils/Options/Editeur puis cocher Déclaration des variables obligatoire pour avoir automatiquement la ligne option explicit sur tes nouveaux modules)

    2) Vu que tu utilises la librairie, tu peux initialiser ton dico avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dico = New Scripting.Dictionary
    La déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dico = CreateObject("Scripting.Dictionary")
    s'emploie lorsque tu déclares Dico As Object sans avoir coché la librairie dans les références utilisées.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Dans la procédure qui alimente le dictionnaire, tu passes des cellules comme Key et pas des valeurs. (C'est le problème de VBA qui interprète ce que tu passes comme valeur et qui détermine à sa sauce le type de valeur/objet que tu lui passes).

    En ajoutant.value à ThisWorkbook.Sheets("Champs").Cells(i, 1), tu forces le dictionnaire à prendre la valeur comme clé et non l'objet Cellule. Ton code fonctionnera alors sans problème...
    Merci. Je le sentais gros comme une maison que c'était juste une question de format mais au moins maintenant j'en ai la confirmation.

    Pour la remaque que vous m'avez faite tous les deux, elle est juste mais disons que je pensais que le mon erreur venait de là (la déclaration de l'objet avec mon set), donc je testais mon code avec les deux déclarations et lorsque j'ai mis mon code sur ce forum j'avais l'autre notation.

    Merci à vous deux d'avoir pris du temps pour me répondre.

+ 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. [Débutant] Vaut il mieux utiliser un Dictionary ou une Liste? (Performance)
    Par takinelinfo dans le forum C#
    Réponses: 17
    Dernier message: 04/08/2011, 13h49
  3. [D7][Commerce Server] Utiliser le Dictionary
    Par Aka Guymelef dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/02/2008, 15h59
  4. Utilisation Dictionary
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 18/10/2004, 15h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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