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

VBA Access Discussion :

Gestion des erreurs en VBA


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut Gestion des erreurs en VBA
    Bonjour,

    Je me demandais s'il y avait un moyen simple d'implémenter une gestion des erreurs dans chaque modules, sub, fonctions VBA sans devoir re-taper cela (50% du code est identique) dans chaque modules, sub, fonctions?

    Merci d'avance pour vos idées et/ou exemples.
    Belle journée

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Ma modeste contribution à cette file sur un sujet "critique" :

    Toutes mes procédures VBA sont construites ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub toto()
    If Not Mode_debug Then On Error GoTo err
          'exemple de code pris au hasard
    100 If Me.Recordset.RecordCount = 0 Or Recordset.EOF Or IsNull(cd_pers1) Then Exit Sub
    101 If qui <> User_init And Not D_admin Then MsgBox "Cette ligne ne peut être supprimée que par " & qui, vbInformation, "": Exit Sub
    102 If MsgBox("Supprimer la ligne sélectionnée ?", vbYesNo, "confirmation") = vbYes Then
    104   cnx.Execute "DELETE FROM pers1 WHERE cd_pers1=" & cd_pers1, dbFailOnError
    106   Requery
    110   If Recordset.RecordCount > 0 Then Recordset.MoveFirst 'Else moins.Enabled = False
        End If
        Exit Sub
    err: Call message("Erreur " & err.Number & "/" & Erl & " dans Monform.toto : " & err.description)
    End Sub
    Le mode_debug est celui réservé aux développeurs (le code s'arrête sur l'erreur)
    Dans le cas contraire, la procédure message centralise toutes les erreurs :
    - filtre des erreurs sans importance
    - affiche le message à l'utilisateur s'il y en a un (qui généralement ne le lit pas)
    - écrit une ligne dans le livre de bord du logiciel

    La numérotation des lignes est fastidieuse mais on s'y fait... Et le livre de bord est d'une efficacité redoutable pour le débug du code
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut
    Bonjour Nico84,

    Merci pour ta contribution Mais j'ai quelques question à son propos
    Avec le code pris au hasard (donc en m'attachant surtout au fond des actions que celui-ci exécute):
    - je comprends le filtrage des erreurs sans importance
    - l'affichage du message pour l'utilisateur (je suis d'accord avec toi, e, général ceux-ci ne le lise pas et ne font pas remonter l'info)

    Mais je ne comprends pas comment tu fais pour écrire une ligne dans le livre de bord du logiciel (à moins que message() est ta fonction d'écriture?)
    Ni pourquoi tu numérotes les lignes (de 100 à 110, par exemple)...

    En attendant tes lumières je te souhaite une belle journée

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par Dermochelys Voir le message
    Mais je ne comprends pas comment tu fais pour écrire une ligne dans le livre de bord du logiciel (à moins que message() est ta fonction d'écriture?)
    oui c'est dans cette fonction (et le livre de bord est une des tables de la dorsale)
    Citation Envoyé par Dermochelys Voir le message
    Ni pourquoi tu numérotes les lignes (de 100 à 110, par exemple)...
    le message indique grace à Erl la ligne en erreur ce qui est très pratique... mais nécessite que les lignes soient numérotées
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut
    Bonjour nico84,

    En cherchant ce que signifie Erl, j'ai trouvé ceci.

    Ok pour la numérotation manuelle. Mais on dirait qu'on ne doit pas tout numéroter? Y a t'il une règle à suivre?

    Et cerise sur le gâteau, tu ne connais personne qui propose une fonction gratuite qui pourrait numéroter à posteriori les codes VBA?

    merci pour ton aide

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par Dermochelys Voir le message
    Ok pour la numérotation manuelle. Mais on dirait qu'on ne doit pas tout numéroter? Y a t'il une règle à suivre?
    Je ne numérote que les lignes qui peuvent faire une erreur (pas celles vides ou celles avec juste end if par exemple)
    Dans un select case ça refuse de numeroter le 1er case
    Sinon on fait un peu ce qu'on veut, il vaut mieux laisser des trous pour pouvoir rajouter du code après

    Citation Envoyé par Dermochelys Voir le message
    Et cerise sur le gâteau, tu ne connais personne qui propose une fonction gratuite qui pourrait numéroter à posteriori les codes VBA?
    Il suffit de mettre son code dans un fichier texte et d'écrire une petite moulinette, j'avais fait ça à l'époque ça va vite

    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
    'NG/23.11.10 ajoute un n° en tête de ligne pour gestion d'erreur
    Private Sub add_no_Click()
    Dim OFName As OPENFILENAME
    Dim a As Integer
    Dim FSO As New Scripting.FileSystemObject
    Dim F1 As Scripting.TextStream, F2 As Scripting.TextStream
    Dim T As String, s As String, i As Integer, suite As Boolean
     
    'demande le fichier à traiter
    OFName.lStructSize = Len(OFName) 'Set the structure size
    OFName.hwndOwner = Me.hwnd       'Set the owner window
    OFName.hInstance = Application.hWndAccessApp 'Set the application's instance
    'Set the filet
    OFName.lpstrFilter = "All Files (*.*)" + Chr$(0) + "*.txt" + Chr$(0)
    OFName.lpstrFile = Space$(254) 'Create a buffer
    OFName.nMaxFile = 255          'Set the maximum number of chars
    OFName.lpstrFileTitle = Space$(254) 'Create a buffer
    OFName.nMaxFileTitle = 255 'Set the maximum number of chars
    OFName.lpstrInitialDir = "c:\planet" 'Set the initial directory
    OFName.lpstrTitle = "Choix du fichier" 'Set the dialog title
    OFName.flags = 0 'no extra flags
     
    x_file = ""
    If GetOpenFileName(OFName) Then
      'on recupere 254 caracteres il faut limiter au fichier et trouver chr(0)
      a = InStr(OFName.lpstrFile, Chr(0))
      x_file = Left(OFName.lpstrFile, a - 1)
    End If
    If Len(x_file) = 0 Then MsgBox "Aucun fichier :(": Exit Sub
    Call copie(x_file, Replace(x_file, "txt", "old"))
    'MsgBox "Fichier à générer : " & x_file
    i = 98
    suite = False
     
    Set F1 = FSO.OpenTextFile(Replace(x_file, "txt", "old"))
    Set F2 = FSO.OpenTextFile(x_file, ForWriting, True)
     
    'parcourt le fichier texte dans F1 et écrit dans F2
    While Not F1.AtEndOfStream
      T = F1.ReadLine
      s = Trim(T)
      If Left(s, 7) = "End Sub" Or Left(s, 7) = "End Fun" Then
        i = 98
      ElseIf Left(s, 4) = "Err:" Then
        If InStr(T, "& Erl &") = 0 Then T = Replace(T, "err.Number", "err.Number & ""/"" & Erl")
      ElseIf s = "" Or Left(s, 4) = "Dim " Or Left(s, 7) = "Public " Or Left(s, 8) = "Private " Or Left(s, 7) = "Option " _
      Or Left(s, 8) = "Declare " Or s = "If Not Mode_debug Then On Error GoTo err:" Then
        'rien
      ElseIf suite Or s = "Else" Or s = "Exit Sub" Or s = "Exit Function" Or Left(s, 1) = "'" Or Left(s, 1) = "&" _
      Or Left(s, 3) = "End" Or Left(s, 4) = "Wend" Or Left(s, 4) = "Next" Or Left(s, 5) = "Case " Then
        If i > 98 Then T = "    " & T
      Else
        i = i + 2
        T = Format(i, "000") & " " & T
      End If
      F2.WriteLine T
      suite = Right(s, 1) = "_"
    Wend
    F1.Close: Set F1 = Nothing
    F2.Close: Set F2 = Nothing
    Set FSO = Nothing
    'Demande à l'utilisateur s'il veut visualiser le fichier
    'If MsgBox("Voulez vous ouvrir le fichier généré ?", vbQuestion + vbYesNo) = vbYes Then
      Shell "notepad.exe " & x_file, vbMaximizedFocus
    'End If
    End Sub
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut
    rapide comme l'éclair !

    Merci pour les précisions et le code de la moulinette

    J'ai vu aussi, par ailleurs, que la numérotation était limitée à 65000 et quelque par module/fonction (c'est lié à la nature de la valeur Erl, il semble).
    Je suppose qu'on peut contourner ça en subdivisant les modules/fonctions.

    Je mets Résolu en tout cas
    Un grand merci!!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 225
    Points : 553
    Points
    553
    Par défaut
    Salut,

    Il y a un complément qui fait ça très bien, je crois que c'est MZTools
    il place des gestions d'erreur dans les procédures, functions, Modules, toutes les lignes automatiquement
    On peut aussi numéroter les lignes automatiquement

    Cherche sur le forum

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

Discussions similaires

  1. [AC-2013] Gestion des erreurs en VBA déclanchée par un "Update"
    Par Eltom_octo dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/02/2017, 15h00
  2. Gestion des erreurs en VBA
    Par fardon57 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/09/2010, 11h49
  3. question d'un débutant sur la gestion des erreurs en VBA
    Par David1259 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/01/2009, 12h43
  4. [VBA-E] Dysfonctionnement dans la gestion des erreurs
    Par Choco49 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2006, 11h44
  5. [VBA-E] Pb sur gestion des erreurs
    Par micoscas dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 08/03/2005, 17h08

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