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

  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
    Points : 658
    Points
    658
    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
    Allez le RC LEns

  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
    Points : 658
    Points
    658
    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 .
    Allez le RC LEns

  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 éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    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
    Points : 658
    Points
    658
    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
    Allez le RC LEns

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    et le module ThisWorkbook ?

  8. #8
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    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
    Private Sub Workbook_Open()
     
        MsgBox ("Bonjour, " & Application.UserName)
     
            'Date de report à initialiser
        With ThisWorkbook
            .Worksheets("Suivis").Calculate
            .Worksheets("Perfs").Calculate
        End With
     
            'Mise à jour et verifications des datas
        Call Update(VerifLien:=True, DicoLink:=True, VerifUnderlying:=True, _
        DicoSuivis:=True, DicoProd:=True, DicoTeam:=True, msg:=True)
     
    End Sub
    Voici merci a toi
    Allez le RC LEns

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    C'est un jeu de carte au trésor ?

    et la procédure Update elle est où ?


    C'est très confus, on ne voit toujours pas en quoi tes dictionnaires sont alimentés dès l'ouverture du classeur

  10. #10
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Voici
    Une petite explication alors

    Ouverture dans le thisworkbook j'appel ma sub update avec la generation de tous les dictionnaires et des tests de vérification.


    Ouverture :

    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
    Private Sub Workbook_Open()
     
        MsgBox ("Bonjour, " & Application.UserName)
     
            'Affichage
        Application.ScreenUpdating = False
     
            'Date de report à initialiser
        With ThisWorkbook
            .Worksheets("Suivis").Calculate
            .Worksheets("Perfs").Calculate
        End With
     
            'Mise à jour et verifications des datas
        Call Update(VerifLien:=True, DicoLink:=True, VerifUnderlying:=True, _
        DicoSuivis:=True, DicoProd:=True, DicoTeam:=True, msg:=True)
     
            'Affichage
        Application.ScreenUpdating = True
    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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
     Public MyDicoSales As New Dictionary
     Public MyColsuivis As New Dictionary: Public MyDicoLink As New Dictionary
     Public MyDicoDBLink As New Dictionary: Public MyColProd As New Dictionary
     Public MyDataSuivis As New Dictionary: Public MyDicoError As New Dictionary
     
     
     
    '_____________________________________Sub de verification des données ou erreurs___________________________________________
     
        'Initialisation globale d'ouverture
    Sub Update(Optional VerifLien As Boolean, Optional DicoLink As Boolean, Optional VerifUnderlying As Boolean, _
    Optional DicoSuivis As Boolean, Optional DicoProd As Boolean, Optional DicoTeam As Boolean, Optional msg As Boolean)
     
        Dim MyMsg As String, Mykey As Variant
        Dim i As Long
     
        On Error GoTo ErrorMana
     
            'Affichage
        Application.ScreenUpdating = False
     
            'Effacer les erreurs
        If Not MyDicoError Is Nothing Then MyDicoError.RemoveAll
     
        '-------------------Verification--------------------
     
     
            'Verifier les liens
        If VerifLien = True Then
            Call Initialize.LinkCheck
        End If
     
            'Verif si on a tous les SJ dans Bloom
        If VerifUnderlying = True Then
            Call Initialize.CheckUnderlying
        End If
     
            'Creation dictionnaires du DB
        If DicoLink = True Then
            Call Initialize.DicoLink
        End If
     
            'Creation dictionnaire des colonnes de suivis
        If DicoSuivis = True Then
            Call Initialize.DicoSuivis(ColB:=True, DataB:=True)
        End If
     
     
            'Dictionnaire de l'onglet produits
        If DicoProd = True Then
            Call Initialize.MyProductData
        End If
     
     
            'Dico des team sales
        If DicoTeam = True Then
            Call Initialize.InitializeDicoSales
        End If
     
        '==================Rapport d'erreur=======================================
     
            'Saisi du message d'erreur
        If msg Then
            If MyDicoError.Count > 0 Then
                MyMsg = "Voici les erreurs à corriger durant la vérification"
                For Each Mykey In MyDicoError.Keys
                    MyMsg = MyMsg & vbNewLine & "- " & Mykey & " :" & MyDicoError(Mykey).MyType
                    MyMsg = MyMsg & " sur la feuille : " & UCase(MyDicoError(Mykey).SheetName) & " (Durant : " & MyDicoError(Mykey).State & " )."
                Next Mykey
                MsgBox (MyMsg)
            Else:
                MsgBox ("Tout est OK lors de la verification des données")
            End If
        End If
     
            'Affichage
        Application.ScreenUpdating = True
        Exit Sub
    ErrorMana:
            'Affichage
        Application.ScreenUpdating = True
        MsgBox ("Probleme lors de la verif du wb")
        Exit Sub
    End Sub
    Allez le RC LEns

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans ton code précise les noms des modules ça peut aider!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_Open()j
     
    Public MyDicoSales As New Dictionary
     
     'Initialisation globale d'ouverture
    Sub Update(Optional VerifLien As Boolean, Optional DicoLink As Boolean, Optional VerifUnderlying As Boolean, _
    Optional DicoSuivis As Boolean, Optional DicoProd As Boolean, Optional DicoTeam As Boolean, Optional msg As Boolean)
    Dernière modification par LittleWhite ; 08/05/2016 à 19h37. Motif: Balises code

  12. #12
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Architecture :


    Module Initialize est le module ou j'ai tous les dictionnaires et la sub d'initialisation qui les appel (sub update)
    Dans thisworkbook j'appel la macro update qui est dans le module initialize

    Toute la partie dictionnaire et test est dans le module initialize.

    J'ai d'autres modules qui utilisent ce module, pour des tests et donc aussi pour appeler les dictionnaires car ils sont souvent vide :/

    Voila j'espere c'est plus claire dsl
    Allez le RC LEns

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ce qui importe c'est le cheminement, car tu semble faire ce qu'il faut, mais force est de constater que ce n'est pas le cas!

  14. #14
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu as déjà testé :

    1) à la fin de la procédure update : si les dictionnaires sont bien alimentés
    2) dans la procédure Open : après le traitement de la procédure update, tester si les dictionnaires sont toujours alimentés
    3) aucun contournement sauvage des erreurs (On Error Resume Next) qui pourrait réinitialiser tes variables publiques.
    4) désactiver toutes les gestions d'erreurs pour vérifier que le problème ne provient pas de ça. Tu lances les macros et tu débug au fur et à mesure où ça plante si besoin.

    Si les 4 tests ont déjà été fait, tu vas devoir espionner le déroulé de ton projet pour comprendre à quel moment tes dictionnaires se vident

    Ps (au passage, rien à voir avec ton PB) : un dictionnaire peut contenir des Items qui sont ... des dictionnaires !
    Vu que tu en utilises beaucoup, réfléchis à l'opportunité d'avoir un dictionnaire Global qui contient tout tes dictionnaires ... plus souple à utiliser dans ton code

  15. #15
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Oufff ca c'est du lourd, je crois que tu as cerné le pb,

    Je n'ai pas le temps de regarder immédiatement car le projet est déjà en prod (il fonctionne), mais effectivement j'ai des on error goto dans chaqune de mes grosses macro ca peut venir de la effectivement. je vais regarder ca.

    Aprés l'idée de mettre un seul et unique dictionnaire est une excellente idée, je n'y avait pas pensé, je vais peut etre faire une V2 sur ce projet
    Je vais regarder ca dans la semaine.

    Par contre la perte de données à cause des on error goto ca me parrait etre un bon exemple d'instabilité car c'est pas vraiment normal ca :/

    Merci
    Allez le RC LEns

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut !

    Pour moi la perte est d'abord une erreur de conception (de logique) car normalement
    il ne devrait même pas y avoir de On Error Goto dans la procédure principale !

    Et n'ayant jamais vu un bon code perdre des données …


    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Lis le code, tu verras que c'est pas le code qui peut perdre des données mais plutôt un utilisateur qui n'aurait pas rentré les données ou renseigné les tableaux correctement, ca permet d'avoir un retour sur la qualité des renseignements renseignés par les utilisateurs. Une petite précision sur les erreurs de liens ou des infos non renseignées permet de maintenir le programme toujours parfaitement bien renseigné, surtout quand les utilisateurs sont multiples

    De plus le on error n'est pas dans la procédure principale pour la bonne raison qu'il n'y a pas de procédure principal et que tout le projet est en événementielle .
    Allez le RC LEns

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    A partir du moment que tu utilises On Error, soit tu le limites à une partie congrue du code
    soit tu gères bien la routine de gestion d'erreurs : pas de perte de données possible !

    Si tel est le cas, la conception est à revoir …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #19
    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
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Je suis d'accord, mais attention je ne sais pas si ca vient de là, il faut que je regarde .
    En suite l'utilisation dans les differentes macro du On error goto ErrorMana est posé en cas de non exactitude des données.
    Mauvaise utilisation base de données access avec une merde , mauvaise gestion des liens dans le dashboard...
    Tous les cas sont souvent difficiles à evaluer, on est pas sur un programme dédié à cela ca doit rester une application qui est développée en moins d'une semaine.
    Aprés moi je regarderais effectivement si ca vient de là.
    Allez le RC LEns

  20. #20
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    J'ai oublié, un truc qui m'échappe

    dans ta procédure "Sub DicoLink()", tu déclares un objet "MyWb as WB"

    c'est quoi ce type WB ?

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