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 :

Erreur dans code VBA et reporting


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Par défaut Erreur dans code VBA et reporting
    Bonjour à toutes et à tous,
    je vais lancer dans mon service un fichier excel avec une belle macro dont je suis assez content pour ne pas dire fier !
    Je l'ai protégée par mot de passe pour éviter, même si ce n'est pas infaillible, qu'elle ne parte à "l'extérieur".
    Bien évidemment je pense qu'il risque d'y avoir quelques coquilles, d'où ma question : est-il possible de répertorier les endroits où ça a planté (ligne de code par ex) avec sauvegarde des valeurs des variables de la macro ? Comme elle est protégée on n'a plus accès au débogueur...
    Portez vous bien surtout,
    SB

  2. #2
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tu vas devoir gérer les erreurs qui surviennent avec On Error... partout où tu suspectes la survenue d'une erreur.

    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
    Sub Test()
      Dim d As Long
      Dim s As String
     
     
      On Error GoTo Catch
     
      s = "Pierre"
      Debug.Print 5 / 0
     
    Catch:
      If Err <> 0 Then Log "Test", VBA.Array("d", d, "s", s)
    End Sub
     
     
    Sub Log(Source As String, Values)
      Dim Channel As Long
      Dim i As Long
     
      Channel = FreeFile
      Open ThisWorkbook.Path & "\log.txt" For Append As Channel
      Print #1, "-----"
      Print #1, Format(Now(), "yyyymmdd hhnnss") & " - " & Source & " - " & Err.Number & " : " & Err.Description
      For i = LBound(Values) To UBound(Values) - 1 Step 2
        Print #1, Values(i) & " : " & Values(i + 1)
      Next i
      Print #1, "-----"
      Close Channel
    End Sub


    Tu peux aussi laisser remonter l'erreur jusqu'au dernier gestionnaire d'erreur (normalement, une proc évènementielle)(1) en lui indiquant la source, mais tu perdras la faculté de récupérer tes variables sauf à les concaténer dans la source ou la description de l'erreur, que tu pourras souvent récupérer par err.description.

    Dans le code évènementiel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_Activate()
      On Error GoTo Catch
     
      Test
     
    Catch:
      If Err <> 0 Then
        Log Err.Description
        MsgBox "L'erreur " & Err.Number & " est survenue dans " & Err.Source & vbLf & Split(Err.Description, ";")(0), vbExclamation
      End If
    End Sub
    La proc qui génère l'erreur et la gestion du log

    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
    Sub Test()
      Dim d As Long
      Dim s As String
     
     
      On Error GoTo Catch
     
      s = "Pierre"
      Debug.Print 5 / 0
     
    Catch:
      If Err <> 0 Then
        Err.Raise Err.Number, "Module1.Test", Err.Description & ";d;" & d & ";s;" & s
      End If
    End Sub
     
     
    Sub Log(Values As String)
      Dim Channel As Long
      Dim i As Long
      Dim v
     
      v = Split(Values, ";")
      Channel = FreeFile
      Open ThisWorkbook.Path & "\log.txt" For Append As Channel
      Print #1, "-----"
      Print #1, Format(Now(), "yyyymmdd hhnnss") & " - " & Err.Source & " - " & Err.Number & " : " & v(0)
      For i = 1 To UBound(v) - 1 Step 2
        Print #1, v(i) & " : " & v(i + 1)
      Next i
      Print #1, "-----"
      Close Channel
    End Sub



    Tu peux aussi gérer l'erreur où elle survient avec un log, puis faire remonter l'erreur jusqu'au dernier gestionnaire apte à informer l'utilisateur par un msgbox

    Dans la proc évènementielle(1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Activate()
      On Error GoTo Catch
     
      Test
     
    Catch:
      If Err <> 0 Then MsgBox "L'erreur suivante est survenue:" & vbLf & Err.Number & vbLf & Err.Description & vbLf & Err.Source
    End Sub
    La proc Text qui génère l'erreur
    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
    Sub Test()
      Dim d As Long
      Dim s As String
     
     
      On Error GoTo Catch
     
      s = "Pierre"
      Debug.Print 5 / 0
     
    Catch:
      If Err <> 0 Then
        Log "Test", Array("d", d, "s", s)
        Err.Raise Err.Number, "Module1.Test", Err.Description
      End If
    End Sub


    Tu peux aussi la faire remonter du log. C'est à toi de voir ce qui te semble le plus simple à mettre en place. il faut juste s'assurer, si tu la fais remonter, qu'elle ne soit pas inscrite x fois dans le log.




    Les résultats dans le fichier log.txt

    Nom : 2021-03-15_171900.png
Affichages : 110
Taille : 10,4 Ko




    (1) Normalement, tout code évènementiel devrait être muni d'une gestion d'erreur, puisque l'appel à ce code évènementiel est le plus bas sur la pile. C'est donc "le dernier rempart" avant le plantage du code avec remise à zéro des variables.
    "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...
    ---------------

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Par défaut Costaud !
    Houla, Houla...
    merci, m'en vais essayer de digérer tout ça...
    Merci beaucoup dans tous les cas...
    Bonne soirée,
    SB

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Par défaut Pourquoi la variable "d"
    Tout est dans l'intitulé...
    Bonne soirée

  5. #5
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    L'inscription dans un fichier de log n'est pas en soir quelque chose de délicat. Ce qui est un peu délicat, c'est de mettre en place une bonne gestion d'erreur, qui commence par l'écriture d'un code qui tend vers le 0 erreurs.

    J'ai pris un exemple flagrant avec une division par zéro, mais c'est une des erreurs les plus simples à éviter en testant le diviseur avant d'effectuer la division. Ma pratique en la matière est:
    • de ne pas programmer "par l'erreur", ce qui veut dire que si je peux éviter la survenance de l'erreur, je le fais plutôt que de laisser générer l'erreur puis de la gérer après;
    • d'écrire du code générique testé et retesté qui permet de réduire considérablement les erreurs;
    • d'utiliser les bonnes pratiques de programmation (déclaration des variables, réduction voire suppression du "hard coding", découpage en "petites" procédures et fonctions qui ont une seule reponsabilité;
    • de s'assurer qu'une procédure fonction n'a qu'une seule sortie, et donc bannir clairement et sans exception les EXIT (Exit Sub, Exit For, Exit Do, ...);
    • de placer systématiquement une gestion d'erreur sur les appels de bas de pile (les procédures évènementielles);
    • de ne jamais appeler une procédure évènementielle par code;
    • de réduire les variables publiques au strict nécessaire (A part un ruban dynamique, je n'utilise jamais de variables publiques);
    • placer systématiquement une gestion d'erreur lors d'utilisation de services externes (ouverture d'un fichier, appel d'une imprimante, ...);
    • ...


    L'erreur zéro n'existe pas, mais en codant de façon professionnelle, on peut déjà réduire drastiquement la survenance des erreurs.
    "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...
    ---------------

  6. #6
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    C'est juste pour l'exemple de transférer les variables et leurs valeurs à la procédure qui écrit le log (c'était ta demande initiale, il me semble). il me fallait donc bien au moins deux variables pour t'illustrer qu'on pouvait les passer au sein d'un tableau (array).
    "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...
    ---------------

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Par défaut Génial
    Merci pour tout !
    J'essaie et je te dis...
    Bonne soirée,
    Sb

Discussions similaires

  1. [XL-2000] Stopper exécution macro VBA pour rechercher erreur dans code
    Par Roudolf dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2020, 08h23
  2. Erreur dans Code vba
    Par marg0t dans le forum Access
    Réponses: 5
    Dernier message: 28/06/2013, 14h10
  3. [WD-2007] Erreur dans code VBA
    Par Elsa742 dans le forum VBA Word
    Réponses: 6
    Dernier message: 21/06/2010, 00h39
  4. Erreur dans code VBA
    Par symphyle dans le forum VBA Access
    Réponses: 7
    Dernier message: 23/12/2008, 14h28
  5. erreur dans code vba
    Par Renardo dans le forum IHM
    Réponses: 2
    Dernier message: 15/12/2008, 15h35

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