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 de tableaux


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut dictionnaire de tableaux
    Bonjour à tous,

    J'essaie de manipuler un dictionnaire dont les items sont des tableaux.
    Mais une fois affectés au dictionnaire (via la méthode Add), je n'arrive pas à accéder en écriture à ces tableaux.
    Un exemple sera plus parlant:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Option Explicit
    Option Base 1
     
    Sub test()
     
        Dim dico As Scripting.dictionary
        Dim test() As Integer
        Dim i As Integer
     
        Set dico = CreateObject("Scripting.Dictionary")
     
        ReDim test(1, 2)
        test(1, 1) = 1
        test(1, 2) = 2
        dico.Add "titi", test    
     
        ReDim test(1, 3)
        test(1, 1) = 10
        test(1, 2) = 20
        test(1, 3) = 30
        dico.Add "toto", test
     
        dico("toto")(1, 3) = 40   'n'affecte pas la valeur mais ne renvoie pas de message d'erreur???
     
        For i = 1 To UBound(dico("titi"), 2)
            Debug.Print dico("titi")(1, i)         'affiche 1, 2
        Next i
     
        For i = 1 To UBound(dico("toto"), 2)
            Debug.Print dico("toto")(1, i)       'affiche 10, 20 et 30 au lieu de 40?
        Next i
     
    End Sub
    Voilà si quelqu'un sait comment remédier à cela, et aussi le pourquoi de la chose....

    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Tu peux refaire un test après avoir ajouté
    en tête de module.

    Cordialement.

  3. #3
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    merci gFZT82 mais je suis déjà en base 1 pour les tableaux (c'est vrai que je l'ai pas mis dans le code posté ci dessus).
    Je vais corriger le post.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Et avec un tableau de tableaux ?
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Sub test()
     
        Dim Tbl() As Variant
        Dim test() As Integer
        Dim i As Integer
     
        ReDim Tbl(1 To 2)
     
        ReDim test(1, 2)
        test(1, 1) = 1
        test(1, 2) = 2
        Tbl(1) = test
     
        ReDim test(1, 3)
        test(1, 1) = 10
        test(1, 2) = 20
        test(1, 3) = 30
     
        Tbl(2) = test
     
        Tbl(2)(1, 3) = 40 'redéfini la valeur
     
        For i = 1 To UBound(Tbl(1), 2)
            Debug.Print Tbl(1)(1, i)
        Next i
     
        For i = 1 To UBound(Tbl(2), 2)
            Debug.Print Tbl(2)(1, i)
        Next i
     
    End Sub
    Ici, tu as une petite erreur, ce n'est pas (1, 4) mais (1, 3) la dimension 4 n'existant pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dico("toto")(1, 4) = 40
    Hervé.

  5. #5
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Merci Hervé, effectivement avec l'indice 4 ma question n'avait pas beaucoup de sens=> j'ai corrigé dans le post.

    Un tableau de tableau ça ne me va pas trop, car j'ai besoin d'un clef unique pour identifier chaque tableau et vérifier son existence

    Quoiqu'il soit je ne comprends pas pourquoi je ne peux pas aller écrire dans le tableau une fois qu'il est ajouté au dictionnaire....
    J'ai déjà manipulé des dictionnaires d'objets et je n'avais pas ce problème.?

  6. #6
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Tu peux affecter le tableau complet à ton dictionnaire mais tu ne peux pas modifier une valeur particulière de ce tableau dans ton dictionnaire (cas de la modification d'un élément).
    La solution, c'est de modifier le tableau et de le réaffecter au dictionnaire.
    Merci GFZT, c'est ce que m'avais proposé ctac. Mais j'aimerais savoir pourquoi cette affection directe est impossible avec des tableaux alors qu'elle fonctionne avec des objets.

  7. #7
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Je n'avance pas d'un poil sur le sujet, je recule même.
    L'affectation d'un tableau ou d'un objet au dictionnaire crée bien une copie de ces derniers avant de les ajouter et fait pointer l'item du dictionnaire dessus. Cf. code ci dessous
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Option Explicit
    Option Base 1
     
    Sub test()
     
        Dim dico As Object
        Dim test() As Integer
        Dim i As Integer
     
        Set dico = CreateObject("Scripting.Dictionary")
     
        ReDim test(1, 2)
        test(1, 1) = 1
        test(1, 2) = 2
        dico.Add "titi", test
     
        Debug.Print VarPtr(dico("titi")(1, 1)) = VarPtr(test(1, 1)) 'Faux =>une copie a été créée
     
    End Sub
     
    Sub test2()
     
        Dim dico As Object
        Dim rngTest As Range
        Dim i As Integer
     
        Set dico = CreateObject("Scripting.Dictionary")
     
        Set rngTest = ThisWorkbook.Worksheets(1).Range("A1")
        dico.Add "titi", rngTest
     
        Debug.Print VarPtr(dico("titi")) = VarPtr(rngTest) 'Faux =>une copie a été créée
     
    End Sub
    Alors pourquoi l'affection directe (via le dictionnaire) est impossible avec des tableaux alors qu'elle fonctionne avec des objets?

  8. #8
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Ca doit venir de la manière dont sont gérés les tableaux. Ce ne sont pas des variables standard (Comme Boolean, Byte, Integer, Double...), ni vraiment des objets. Il doit y avoir une histoire de pointeurs et d'adresses mémoires derrière, mais il faudrait demander à ceux qui ont créé le VBA.
    Je reconnais que c'est parfois frustrant de ne pas comprendre ce qui se passe, mais parfois, il faut accepter que c'est comme ça et donc le gérer d'une autre manière. Ca ne te bloque en rien pour continuer ton programme.

  9. #9
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Non ça ne me bloque en rien c'est vrai, mais comme tu le dis ç'est super frustrant de pas piger le fonctionnement.

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

Discussions similaires

  1. [Toutes versions] manipuler les doublons avec un dictionnaire et/ou variables tableaux
    Par patricktoulon dans le forum Contribuez
    Réponses: 0
    Dernier message: 31/05/2013, 15h06
  2. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30
  3. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44
  4. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  5. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 18h10

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