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 dictionnaire - Module de Classe


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut Dictionnaire de dictionnaire - Module de Classe
    Bonjour,

    Mon problème est le suivant : J'aimerai insérer un dictionnaire dans un autre dictionnaire. Le second dictionnaire se trouve dans un module de classe "Program_Parameters" parmi d'autres variables. De même il existe un module de classe "Tag_Parameters" pour stocker les variables du deuxième dictionnaire.

    Le code permettant le remplissage des dictionnaire compile correctement :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    Sub Fill_Dic_Program_P()
     
        Dim CM_Program_P As New Program_Parameters
        Dim CM_Tag_P As New Tag_Parameters
        Dim I As Long
        Dim J As Long
        Dim Key_i As String
        Dim Tag_j As String
     
        Set Dic_Program_P = Nothing
        Set Dic_Program_P = New Dictionary
     
        With ThisWorkbook.Sheets(MySheet).Range(MyRange)
     
            For I = 1 To .Rows.Count
     
                Key_i = .Cells(I, 1)
     
                With ThisWorkbook.Sheets(TAG_P_SheetName).Range(Tag)
     
                    For J = 1 To .Rows.Count
     
                        Set CM_Program_P.Dic_Tag = Nothing
                        Set CM_Program_P.Dic_Tag = New Dictionary
     
                        Tag_j = .Cells(J, 1).Value
     
                        CM_Tag_P.Tag_Output = X
                        CM_Tag_P.Tag_Value = Y
     
                        If Not CM_Program_P.Dic_Tag.Exists(Tag_j) Then
                            CM_Program_P.Dic_Tag.Add Tag_j, CM_Tag_P
                        End If
     
                        Set CM_Tag_P = Nothing
     
                    Next J
     
                End With
     
                '***
     
                If Not Dic_Program_P.Exists(Key_i) Then
                    Dic_Program_P.Add Key_i, CM_Program_P
                End If
     
                Set CM_Program_P = Nothing
     
            Next I
     
        End With
     
    End Sub
    Mais c'est en voulant accéder aux informations du deuxième dictionnaire que j'ai un problème.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Test_1 = Dic_Program_P.Item(Key_i).Dic_Tag.Item(Tag_j).Tag_Output
    Mais j'obtiens l'erreur 424 : objet requis.

    Je suis à votre disposition pour plus de détails

    Merci pour votre aide,

    Nicolas

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    Un remarque, pourquoi toujours mettre à Nothing avant de définir un objet, c'est inutile, un objet est par défaut initialisé à Nothing à sa création.

    Lorsqu'on utilise les Modules de class, il y a des choses à respecter, regarde les tutoriels a ce sujet.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set CM_Program_P.Dic_Tag = New Dictionary
    N'a rien a faire ici, il faut faire ça dans ton module de Class, dans la procédure initialize().

    Ici ça n'ira pas non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        If Not CM_Program_P.Dic_Tag.Exists(Tag_j) Then
                            CM_Program_P.Dic_Tag.Add Tag_j, CM_Tag_P
                        End If
     
                        Set CM_Tag_P = Nothing
    Tu dis à CM_Program_P.Dic_Tag, "voila je te dis de regarder ce tableau" (tu ne lui transmet pas le tableau, juste sont "adresse". Puis 2 lignes plus bas, tu détruit le tableau, les valeurs sont perdues et il ne sait plus ou regarder.

    Je pense que tu devrais nous expliquer clairement ce que tu veux faire dans la globalité. Il serait peut être intéressant de faire une collection de dictionnaires dans ton Modules de Class Program_Parameters.

    Une dernière chose, attention au fuites mémoire avec les imbrications de modules de Classe.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    Merci beaucoup pour ta réponse.

    J'ai mis l'instruction suivante dans la procédure "initialize" du module de classe et tout marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set CM_Program_P.Dic_Tag = New Dictionary
    Merci encore

  4. #4
    Membre averti
    Homme Profil pro
    Resp. Technique d'applications VB/VBA en SSII
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Resp. Technique d'applications VB/VBA en SSII

    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    Bonjour qwazerty,
    Je rebondis sur ta dernière remarque... et sort un peu du sujet initial...
    A quoi penses-tu lorsque tu parles de fuite mémoire ?


    Citation Envoyé par Qwazerty Voir le message
    Salut

    Une dernière chose, attention au fuites mémoire avec les imbrications de modules de Classe.

    ++
    Qwaz

  5. #5
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    J'avais eu des problèmes de fuite mémoire quand j'apprenais la logique objet. J'avais fait des objets en contenant d'autres en contenant d'autres, et si je lançais ma macro 10 fois de suite(sans mise à jour, sur exactement le même référentiel), c'était de plus en plus lent.

    J'ai dont pris l'habitude de mettre des partout, à chaque fin de paragraphe ou je les ai ouverts. 99% d'entre eux ne servent sans doute à rien, mais comme il est arrivé que certains servent.....

    J'ai donc des trucs un peu lourds du genre :

    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
    Sub MaJTousFeuillets()
        Dim WS As Worksheet, AWS As Worksheet
        Dim WB As Workbook
        Application.ScreenUpdating = False
        Set AWS = ActiveSheet
        Set WB = ActiveWorkbook
        For Each WS In WB.Worksheets
            WS.Activate
            WS.Select
            Call MAJLignes(WS)
        Next
        AWS.Select
        Set AWS = Nothing
        Set WS = Nothing
        Set WB = Nothing
        Application.ScreenUpdating = True
    End Sub
    Mais je suis à peu près sur de ne rien laisser passer.....(les puristes vont sans doute me flamber, mais c'est l'occasion de m'améliorer).

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Citation Envoyé par Buffalo1214 Voir le message
    Bonjour qwazerty,
    Je rebondis sur ta dernière remarque... et sort un peu du sujet initial...
    A quoi penses-tu lorsque tu parles de fuite mémoire ?
    Salut

    En fait, lors des recherches faites sur le sujet, il est apparu, si je me souviens bien ... que lorsque dans un module de classe, tu utilises des variables, dont le type est lui même issue d'un autre module de classe, les objets contenus dans ta variable ne sont pas éliminés automatiquement de la mémoire.
    C'est ce que d'écrit el_slapper

    Il faut donc dans ce cas, bien veiller à vider les espaces mémoires en passant à Nothing les variable contenu dans ta classe "finale"... vu que même moi, j'ai du mal à comprendre ce que je viens de noter, je vais te donner un exemple bidon

    On définit une première classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'MaClassUn
     
     Dim MonClasseur as workbook
     
    'Puis au cours du code tu affectes un classeur à la variable, dnas le init de la class par exemple
    Set MonClasseur = Workbooks("ClasseurTeste")
     
    '[...]Suite du code
    Ensuite on défini une deuxième classe qui utilise la première

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'MaClassDeux
    Dim MaFeuille as Worksheets
    Dim UneMaClassUn as New MaclassUn 
    'provoque le init de la classe MaClassUn et donc l'affectation du classeur MonClasseur qu'elle contient en variable
     
    'Dans la suite du code, au niveau du init de cette class par exemple
    Set MaFeuille = Workbook(0).Sheets("Feuil1")
    Maintenant dans un module standard, on utilise notre classe MaClassDeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sub Essai()
     Dim VarMaClassDeux as new MaClassDeux
    En faisant cela on initialise une instance de MaClassDeux qui elle même initialise une instance de MaClassUn.

    On se retrouve donc avec une variable MonClasseur contenue dans MaClassUn et une variable MaFeuille dans MaClassDeux.

    Arrivé à la fin de la procédure Essai
    La variable varMaClassDeux est automatiquement libérée (inutile de la passer à Nothing.
    La variable MaFeuille est elle aussi libérée automatiquement
    La variable MonClasseur par contre n'est pas libérée automatiquement, il faudra donc gérer sa libération dans le corps de MaClassDeux en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Par exemple dans le finalize de MaClassDeux
    MaClassUn.MonClasseur = nothing
    Mes explications sont à prendre avec des pincettes, je fais cela de mémoire, il se peut donc que tout ne soit pas exact...

    En gros il faut autant que possible éviter de faire trop d'imbrication de Module de Class

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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

Discussions similaires

  1. [VBA] Module de classe et évènement
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 20/03/2013, 23h23
  2. [Module de classe] Fonction non liée à l'instance?
    Par Caroline1 dans le forum Access
    Réponses: 6
    Dernier message: 07/04/2006, 20h13
  3. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  4. Réponses: 8
    Dernier message: 22/02/2006, 15h09
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49

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