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 Access Discussion :

Retrouver code ligne erreur après call


Sujet :

Macros Access

  1. #1
    Membre habitué Avatar de Superpat9999
    Homme Profil pro
    Retraité
    Inscrit en
    novembre 2003
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 325
    Points : 136
    Points
    136
    Par défaut Retrouver code ligne erreur après call
    Bonjour,
    Lorsque j'appelle une sous-macro avec call, je souhaite, en cas d'erreur, retrouver le no de ligne de la sous macro et non le no de ligne de la macro appelante.
    Ici, si j'ai une erreur dans la sous-procédure X_Ajoute1sec le renvoi est la ligne 82 et comme NomProcedure A_Mise_En_Page1.
    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
          Sub A_Mise_En_Page1()
              On Error GoTo ErrHandle:
    10        NomProcedure = "A_Mise_En_Page1"
    ...
    82        Call X_Ajoute1sec  
    ...
    ErrHandle:
    191       ErrLOg = ErrLOg & "Procédure : " & NomProcedure & Chr(13) _
              & "Erreur N° : " & Err.Number & Chr(13) _
              & "Description : " & Err.Description & Chr(13) _
              & "Ligne N° : " & Erl() & Chr(13) _
              & "Date : " & Date & " et " & "Heure : " & Time
     
    192       szMsg = "Une erreur est survenue, prévenir Toto" & vbLf _
              & ErrLOg
    193       szStyle = 16
    194       szTitle = "Erreur !"
    195       MsgBox szMsg, szStyle, szTitle
     
    196       ErrLOg = ""
              'Reprend l'exécution au après la ligne à l'origine de l'erreur.
              'Resume Next
              'Réinitialise les propriétés de l'objet Err.
    197       Err.Clear
          End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Sub X_Ajoute1sec()
    10        NomProcedure = "X_Ajoute1sec"
    11        IntervalType = "s"    ' "m" specifies months as interval.
    12        FirstDate = Range("A11")
    ...
    Merci de votre aide
    Le mieux est l'ennemi du bien

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    14 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 14 943
    Points : 22 730
    Points
    22 730
    Par défaut
    Bonjour.

    Je pense que si tu veux le erl dans une procédure appellée il faut mettre ta gestion d'erreur dans la procédure appellée.

    Si tu veux tout de même passé l'erreur à l'appellant tu peux mettre dans l'appellé un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    call msgbox("Erreur : " & err.number & ", " & err.description, vbExclamation) 'ici à la place tu peux mettre du code qui enregistre l'erreur dans une table ou un fichier ou autre endroit.
    call err.raise(err.number, ,err.description) 'Passe l'erreur au niveau du dessus.
    Dans l'appelant tu peux aller "pécher" l'info sur l'erreur là où tu l'as stockée.

    Et attention avec erl, perso j'ai eu des surprises sur le numéro de ligne retourné. Fait des tests pour valider que tu attrapes bien ce que tu veux.

    Note en passant cela fait quelques siècles maintenant :-) qu'on ne numérote plus les lignes de code sauf très rares exceptions mais si tu le fais à la main pense à ne pas mettre des numéros contigus (ex 10, 11, 12) mais laisse des trous (ex : 10, 20, 30) comme cela tu n'as pas à renuméroter tes lignes à chaque insertion.

    Une façon que j'ai découvert récement de savoir où cela plante est de mettre dans le code de la gestion d'erreur un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    call msgbox("Erreur : " & err.number & ", " & err.description, vbExclamation)
    resume exit_ma_syb
    resume
    Le second resume te sert quand tu as une erreur.
    1. Le message s'affiche
    2. tu fais [ctrl][break] pour arrêter l'exécution
    3. tu déplaces le curseur d'exécution sur le [CODEinline]resume[/CODEline]
    4. tu appuis sur [F8] et cela te ramène à l'instruction qui a provoquer l'erreur.


    Une autre méthode que j'utilisais était de conditionner mes On Error Goto avec une constante globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cosnt IS_MODE_BEDUG as boolean = True 'False en prod
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not IS_MODE_BEDUG then
       on error goto Err_MaSub
    end if
    Et la dernière stratégie est de prévenir l'erreur, si tu sais que tu vas avoir une erreur met du code avant pour faire une validation et ne pas exécuter le code concerné si tu es dans les conditions de l'erreur.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué Avatar de Superpat9999
    Homme Profil pro
    Retraité
    Inscrit en
    novembre 2003
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 325
    Points : 136
    Points
    136
    Par défaut
    Merci marot_r pour toutes ces précisions. Cela m'a fait plaisir de voir ta réponse ce matin.
    Pour numéroter et dénuméroter, j'ai fait une macro qui fonctionne très bien sous Excel.
    Pour Access, c'est un peu plus compliqué, je l'ai faite sous Word et là, je fais un aller retour avec copier/coller.
    Bien, maintenant, je sais que je dois intervenir dans toutes les procédures


    Mon code :
    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 A_Mise_En_Page2()
    10        NomProcedure = "A_Mise_En_Page1"
              On Error GoTo ErrHandle1:
     
    82        Call X_Ajoute2sec(NomProcedure, Ligne)
    End
    ErrHandle1:
              If Ligne = "" Then
                    Ligne = Erl()
              End If
    191       ErrLOg = ErrLOg & "Procédure : " & NomProcedure & Chr(13) _
              & "Erreur N° : " & Err.Number & Chr(13) _
              & "Description : " & Err.Description & Chr(13) _
              & "Ligne N° : " & Ligne & Chr(13) _
              & "Date : " & Date & " et " & "Heure : " & Time
     
    192       szMsg = "Une erreur est survenue, prévenir Toto" & vbLf _
              & ErrLOg
    193       szStyle = 16
    194       szTitle = "Erreur !"
    195       MsgBox szMsg, szStyle, szTitle
     
    196       ErrLOg = ""
    197       Err.Clear
          End Sub
     
     
          Sub X_Ajoute2sec(NomProcedure, Ligne)
             On Error GoTo ErrHandle1:
    10      NomProcedure = "X_Ajoute2sec"
     
              Ligne = ""
    20      Call MsgBox("Erreur : " & Err.Number & ", " & Err.Description, vbExclamation)
    35      Resume exit_ma_syb 'Produit l'erreur
    11        IntervalType = "s"    ' "m" specifies months as interval.
    12        FirstDate = Range("A11")
              End
    ErrHandle1:
              Ligne = Erl()
              Debug.Print NomProcedure & " " & Ligne
              Call Err.Raise(Err.Number, Err.Description)    'Passe l'erreur au niveau du dessus.
    exit_ma_syb:
          End Sub
    Le mieux est l'ennemi du bien

Discussions similaires

  1. erreur après mise en ligne
    Par etienne.clopeau dans le forum Django
    Réponses: 1
    Dernier message: 29/03/2010, 23h37
  2. Page .asp renvoi une erreur après 500 lignes
    Par hamsterj dans le forum ASP
    Réponses: 13
    Dernier message: 02/09/2009, 20h25
  3. [AC-2003] Code VBA incorrect après division données / GUI (erreur 3219)
    Par -ULK- dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/07/2009, 11h17
  4. retrouver la ville d'apres le code postal
    Par saiclon dans le forum IHM
    Réponses: 8
    Dernier message: 16/01/2009, 16h43
  5. Retrouver la ligne qui créer l'erreur
    Par schlitters dans le forum Oracle
    Réponses: 10
    Dernier message: 16/06/2006, 18h32

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