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 :

Structure de données en dictionnaire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Structure de données en dictionnaire
    Bonjour,

    Je vous soumet une question que je me pose, sur la structure de donnée dictionnaire.
    J'ai 3 dictionnaires déclarés en public sur un projet que j'ai actuellement. Le problème qui survient
    est que les dictionnaires même en public sont accessibles mais vide d'une macro à l'autre, les valeurs du dictionnaire sont effacées.
    Est il possible de creer un dictionnaire, et de pouvoir le garder en mémoire ?
    Dois-je le creer sous forme de fonction plutot que de sub?

    Merci d'avance
    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
    Sub DicoSuivis(Optional ColB As Boolean, Optional DataB As Boolean)
     
            'Variables
        Dim MyRange As Range, AllRange As Range
        Dim NBL As Long, MyDataR As DataR
     
        With ThisWorkbook.Worksheets("Suivis")
            NBL = .Range("Suivis_NbReport").Value
     
            If ColB Then
                        'test initialisation dico
                If MyColsuivis.Count > 0 Then MyColsuivis.RemoveAll
     
                    'creation du dictionnaire
                Set AllRange = .Range(.Range("First"), .Range("First").End(xlToRight))
                For Each MyRange In AllRange
                    If Not MyColsuivis.Exists(MyRange.Value) Then
                        MyColsuivis.Add MyRange.Value, MyRange.Column
                    End If
                Next MyRange
            End If
     
            If NBL > 0 And DataB Then
                If MyDataSuivis.Count > 0 Then MyDataSuivis.RemoveAll
     
                Set AllRange = .Range(.Range("Start").Offset(1), .Range("Start").Offset(NBL))
                For Each MyRange In AllRange
                    If Not MyDataSuivis.Exists(MyRange.Value) Then
                        Set MyDataR = New DataR
                        MyDataR.Status = .Cells(MyRange.Row, MyColsuivis("Status")).Value
                        MyDataR.Actif = .Cells(MyRange.Row, MyColsuivis("Choice")).Value
                        MyDataR.Comment = .Cells(MyRange.Row, MyColsuivis("Comment")).Value
                        If .Cells(MyRange.Row, MyColsuivis("Last mailing")).Value = "" Then
                            MyDataR.LastMail = Now()
                        Else
                            MyDataR.LastMail = .Cells(MyRange.Row, MyColsuivis("Last mailing")).Value
                        End If
                        MyDataSuivis.Add MyRange.Value, MyDataR
                    End If
                Next MyRange
            End If
        End With
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, tu déclares ton dico public dans un module qui ne l'est pas,thisworkbook par exemple!

    Ou tu fais un double déclaration une en public et l'autre dans un sub et c'est celui de la sub qui gagne!

    Écris Option explicite en entête de chaque module!
    Dernière modification par Invité ; 04/05/2016 à 08h16.

  3. #3
    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 merci
    Bonjour,

    Merci de ton message, les sub des 3 dictionnaires sont déclarées dans des modules public ou du moins dans des modules que j'ai créé.
    Par contre je ne me suis pas bien exprimé je pense en me relisant.

    Ce n'est pas vraiment du sub à sub. En realité si je déclare et lance mes sub à l'ouverture par exemple, moi j'attend que mes dictionnaires durant l'utilisation du programme je n'ai pas besoin de les relancer, or actuellement c'est le cas.

    Je les lance à l'ouverture dans thisworkbook, mais la sub est bien contenu dans un module public et les dictionnaires sont en public dans ce module et non dans thisworkbook.

    Je me demande si c'est normal, car je pourrais alors gagner en rapidité car tt est géré en evenementiel donc le rappel du dictionnaire me coute .

  4. #4
    Invité
    Invité(e)
    Par défaut
    tes dictionnaire il faut bien le initialiser Non?

    une fois que tu les as initialisé tu les utilise a la demande! je sais pas si j'ai bien compris!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public sub DicoInit()
     Set Dico1 = CreateObject("Scripting.Dictionary")
     Set Dico2 = CreateObject("Scripting.Dictionary")
     Set Dico3 = CreateObject("Scripting.Dictionary")
    'Boucle impément Dico
    impément Doco1
    impément Doco2
    impément Doco3
    end sub

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu peux nous copier le module Standard qui contient la déclaration de tes variables et l'initialisation des Dico + le module Thisworkbook ?


    de plus, les variables publiques ont la fâcheuse habitude de se reset lors de certaines erreurs d'exécution.

    Pour ne pas me retrouver avec des variables que ne sont plus instanciées, je prévois toujours au début des procédures qui les appelleront, un test qui vérifie si l'objet est instancié. Si c'est pas le cas, j'appelle la procédure d'initialisation

  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
    Par contre il est assez long voici.


    mon dictionnaire des colonnes et données
    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
        'initialisation des dictionnaires
    Sub DicoSuivis(Optional ColB As Boolean, Optional DataB As Boolean)
     
            'Variables
        Dim MyRange As Range, AllRange As Range
        Dim NBL As Long, MyDataR As DataR
     
        With ThisWorkbook.Worksheets("Suivis")
            NBL = .Range("Suivis_NbReport").Value
     
            If ColB Then
                        'test initialisation dico
                If MyColsuivis.Count > 0 Then MyColsuivis.RemoveAll
     
                    'creation du dictionnaire
                Set AllRange = .Range(.Range("First"), .Range("First").End(xlToRight))
                For Each MyRange In AllRange
                    If Not MyColsuivis.Exists(MyRange.Value) Then
                        MyColsuivis.Add MyRange.Value, MyRange.Column
                    End If
                Next MyRange
            End If
     
            If NBL > 0 And DataB Then
                If MyDataSuivis.Count > 0 Then MyDataSuivis.RemoveAll
     
                Set AllRange = .Range(.Range("Start").Offset(1), .Range("Start").Offset(NBL))
                For Each MyRange In AllRange
                    If Not MyDataSuivis.Exists(MyRange.Value) Then
                        Set MyDataR = New DataR
                        MyDataR.Status = .Cells(MyRange.Row, MyColsuivis("Status")).Value
                        MyDataR.Actif = .Cells(MyRange.Row, MyColsuivis("Choice")).Value
                        MyDataR.Comment = .Cells(MyRange.Row, MyColsuivis("Comment")).Value
                        If .Cells(MyRange.Row, MyColsuivis("Last mailing")).Value = "" Then
                            MyDataR.LastMail = Now()
                        Else
                            MyDataR.LastMail = .Cells(MyRange.Row, MyColsuivis("Last mailing")).Value
                        End If
                        MyDataSuivis.Add MyRange.Value, MyDataR
                    End If
                Next MyRange
            End If
        End With
    End Sub

    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
    Sub DicoLink()
        Dim MyRange As Range, AllRange As Range
        Dim MyWB As WB
     
            'Si il n'est pas vide on le vide
        If MyDicoProductExtract.Count > 0 Then MyDicoProductExtract.RemoveAll
     
            'Création du dictionnaire des liens
        With ThisWorkbook.Worksheets("DB")
     
                    'Dictionnaire des lignes
            Set AllRange = .Range(.Range("WorkbookName").Offset(1), .Range("WorkbookName").End(xlDown))
            For Each MyRange In AllRange
     
                If Not MyDicoProductExtract.Exists(MyRange.Value) Then
                    Set MyWB = New WB
                    MyWB.Name = MyRange.Value
                    MyWB.FeuilName = MyRange.Offset(, 1).Value
                    MyWB.Link = MyRange.Offset(, 2).Value
                    MyWB.Wbook = MyRange.Offset(, 9).Value
                    MyWB.LongLink = MyRange.Offset(, 2).Value & MyRange.Offset(, 9).Value
                    MyDicoProductExtract.Add MyRange.Value, MyWB
                End If
            Next MyRange
        End With
     
    End Sub
    Dans mon module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Public MyColsuivis As New Dictionary: Public MyDicoLink As New Dictionary
     Public Public MyColProd As New Dictionary
     Public MyDataSuivis As New Dictionary: Public MyDicoError As New Dictionary
    Dans un autre module une sub que j'utilise...
    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
        'Sub pour ajouter  dans suivis ou New Produit
    Sub AddSuppProd(ByVal typeOp As String, ByVal MyReportName As String, _
    ByVal Target As Range)
     
        Dim LStart As Long, MyNewRow As Range
        Dim NBL As Long, AllRangeS As Range
        Dim AllRangeP As Range
        Dim MyActifVect()
        Dim MyStatusVect(), MyComment()
        Dim MyLastMail() As Date, i As Long
     
            'Affichage et reglages
        Application.EnableEvents = False
        Application.ScreenUpdating = False
     
        On Error GoTo errorMana
        Call Initialize.DicoHyperlink(Full:=True)
        Call Initialize.DicoSuivis(ColB:=True)
     
        With ThisWorkbook.Worksheets("Suivis")........ etc
    Tu vois j'appel mes dictionnaires je suis obligé sinon il les reconnais mais pour lui ils sont vides.

    Quand tu dis faire un test je vois ce que tu veux dire, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If MyDico.count<1  then....
    Le truc c'est qu il est tjs vide lol, j'ai finit par faire un call dico lol
    C'est un probleme que j'avais déja rencontré, mais la si je peux eviter de l'appeler sauf si je veux le remettre à jour ca serait cool
    Merci pour vos aides c'est super cool

Discussions similaires

  1. API C convertir un dictionnaire en structure de données de type C
    Par huître dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 15/05/2015, 17h20
  2. Aide pour diagramme de structure des données
    Par DeezerD dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/12/2004, 19h10
  3. Méta-Programmation - [ structures de données ]
    Par Dam)rpgheaven dans le forum C++
    Réponses: 3
    Dernier message: 03/12/2004, 19h38
  4. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15
  5. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10

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