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 :

[VBA-E]Pb "On Error GoTo"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut [VBA-E]Pb "On Error GoTo"
    Bonjour tous,

    J'ai un petit problème avec un code utilisant "On Error GoTo".
    La première fois que je tombe sur une erreur, l'instruction "On Error" marche et je passe à la suite du code.
    Par contre, la deuxième fois que je retombe sur une erreur, ça bug!!!!

    Ci-après un code qui représente mon problème (sélectionne une feuille à partir de son nom si elle existe. Autrement, il repropose de réessayer)

    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 select_sheet()
     
    Dim Msg As String           ' Message du MsgBox
    Dim Title As String         ' Titre du MsgBox
    Dim Response As String      ' Réponse du MsgBox
     
    Début:
    ' Boîte de dialogue
     
        Msg = "Entrer le nom de la feuille"      ' Définit le message.
        Title = "Sélection de feuille"           ' Définit le titre.
     
        Response = Application.InputBox(Msg, Title, Type:=2)
     
    If Response = "" Then
     
    GoTo Début
     
    End If
     
    If Response <> "Faux" Then
     
        On Error GoTo Début
     
        ActiveWorkbook.Sheets(Response).Select
     
    End If
     
    End Sub

    Merci d'avance de votre aide!

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Par contre, la deuxième fois que je retombe sur une erreur, ça bug!!!!
    Rien de plus normal !
    Err est un objet de VB et, comme tout autre objet, il a ses propriétés, parmi lesquelles le propriété number.
    Quand une erreur est rencontrée, la propriété number (err.number, donc) de Err prend la valeur du numéro de l'erreur concernée.
    Tant que cette propriété a cette valeur, VB considère donc logiquement qu'une erreur est toujours présente.
    Il faut donc tout simplement, une fois passé avec succès le "cap" où l'erreur est susceptible de se produire, effacer ce que contient Err par Err.clear
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    on error resume next
    executons_tenter_celà
    err.clear

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut
    Je m'en doutais, mais je voyais pas comment faire. Je suis encore débutant. Merci pour l'info!

    Par contre, si j'applique bien ce que tu dis dans mon exemple, je mettrais "err.clear" juste après Début:

    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
    Sub select_sheet()
     
    Dim Msg As String           ' Message du MsgBox
    Dim Title As String         ' Titre du MsgBox
    Dim Response As String      ' Réponse du MsgBox
     
    Début:
    ' Boîte de dialogue
     
    Err.Clear
     
        Msg = "Entrer le nom de la feuille"      ' Définit le message.
        Title = "Sélection de feuille"           ' Définit le titre.
     
        Response = Application.InputBox(Msg, Title, Type:=2)
     
    If Response = "" Then
     
    GoTo Début
     
    End If
     
    If Response <> "Faux" Then
     
        On Error GoTo Début
     
        ActiveWorkbook.Sheets(Response).Select
     
    End If
     
    End Sub
    J'ai toujours le même problème alors. Est-ce bien logique ce que j'ai tapé comme code?

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Bon!
    Nous n'avons pas les mêmes méthodes d'approche...
    regardes la mienne :
    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
     
    Sub select_sheet() 
      Dim Msg As String           ' Message du MsgBox 
      Dim Title As String         ' Titre du MsgBox 
       Dim Response As String      ' Réponse du MsgBox 
       ' Boîte de dialogue 
        response = ""
        Msg = "Entrer le nom de la feuille"      ' Définit le message.
      Title = "Sélection de feuille"           ' Définit le titre
      While (response = "" Or Err) And response <> "Faux"
        err.clear
        Response = Application.InputBox(Msg, Title, Type:=2) 
        ActiveWorkbook.Sheets(Response).Select 
      Wend
    End Sub
    Un peu plus orthodoxe, non ?
    pas de vilain goto (c'est pas un beau nom, çà...!) pas d"étiquette Début, pas de test à part sur "Faux".. tout ensemble !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut
    Joli code. On voit les pro!
    Je sais pas chez toi, mais chez moi ça marche toujours pas!
    Je pense que c'est normal, puisque tu mets "err.clear" même avant que l'erreur se produise. Il y a erreur quand tu tapes le nom d'une feuille qui n'existe pas.
    Par contre, ton code m'a inspiré et j'ai rajouté un petit "On error resume next" (dsl, j'y tiens! lol) et un code pour générer l'erreur juste avant le while.
    Essaye toi-même.

    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 select_sheet()
      Dim Msg As String           ' Message du MsgBox
      Dim Title As String         ' Titre du MsgBox
      Dim Response As String      ' Réponse du MsgBox
       ' Boîte de dialogue
        Response = ""
        Msg = "Entrer le nom de la feuille"      ' Définit le message.
        Title = "Sélection de feuille"           ' Définit le titre
        On Error Resume Next
        ActiveWorkbook.Sheets(Response).Select
    While (Response = "" Or Err) And Response <> "Faux"
        Err.Clear
        Response = Application.InputBox(Msg, Title, Type:=2)
        ActiveWorkbook.Sheets(Response).Select
    Wend
    End Sub
    Je m'améliore, non? Et, je suis pas orthodoxe!

    Merci à nouveau

    [Balises "Code" ajoutées par AlainTech]
    [Pensez-y vous-même à l'avenir. Merci. ]

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Bravo !
    Je réalisais en dînant que j'avais oublié ce petit détail et venais précisément te le dire !
    Mais places-le plutôt ainsi :
    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
    Sub select_sheet() 
      Dim Msg As String           ' Message du MsgBox 
      Dim Title As String         ' Titre du MsgBox 
       Dim Response As String      ' Réponse du MsgBox 
       ' Boîte de dialogue 
        response = "" 
        Msg = "Entrer le nom de la feuille"      ' Définit le message. 
      Title = "Sélection de feuille"           ' Définit le titre 
      While (response = "" Or Err) And response <> "Faux" 
        err.clear 
        Response = Application.InputBox(Msg, Title, Type:=2) 
        On Error Resume Next  ' <<<====== LA
        ActiveWorkbook.Sheets(Response).Select 
      Wend 
    End Sub
    Tu y gagneras !
    Bien !
    Dans une semaine, tu seras apte à en aider d'autres

  7. #7
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par jmfmarques
    Bravo !
    Je réalisais en dînant que j'avais oublié ce petit détail et venais
    pour digérer vérifie ta théorie sur Err.clear en supprimant la ligne

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Hé ! Bbil, Salut !
    Pourquoi ne relis-tu pas le tout 1er message de notre ami ?
    Tu comprendras pourquoi il le faut, ce petit copain Err.Clear !

  9. #9
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    pour ma part, je l'utilise jammais en vb6, mais en exel...

  10. #10
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par Aide en ligne Excel
    Utilisez la méthode Clear pour effacer de manière explicite le contenu de l'objet Err à la suite du traitement d'une erreur, à l'aide de l'instruction On Error Resume Next par exemple. La méthode Clear est appelée automatiquement dès que l'une des instructions suivantes est exécutée :

    Tout type d'instruction Resume


    Exit Sub, Exit Function, Exit Property


    Toute instruction On Error
    (..)

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Ah ?
    Tu crois ?
    Alors : pourquoi, malgré le On error placé dans le code de hdidan, celà ne fonctionnait plus la 2ème fois ?
    Because c'était déjà TROP TARD, PARDI !
    Et on ne prend de toutes façons jamais ce risque là . ERR.CLEAR SYSTEMATIQUEMENT !!!!!

  12. #12
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par jmfmarques
    Ah ?
    Tu crois ?
    Alors : pourquoi, malgré le On error placé dans le code de hdidan, celà ne fonctionnait plus la 2ème fois ?
    Because c'était déjà TROP TARD, PARDI !
    Et on ne prend de toutes façons jamais ce risque là . ERR.CLEAR SYSTEMATIQUEMENT !!!!!
    ? parce-que cela fonctionnait avec le Err.Clear ?? ...

  13. #13
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Non ! Car non mis à l'endroit stratégique
    mais .... stoppons là ....
    EDIT : Je te laisse simplement, pour finir, et après avoir tout relu, deviner ce que donnerait un passage par le on error resume next, une erreur renvoyant à l'inputbox... et un abandon par "Faux"..... L'err.number resterait présent en mémoire... et tu courerais le risque, en gérant mal plus loin une autre erreur, de te planter joliment !... Mais laisse maintenant !

  14. #14
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    à-t'on résolu son problème???

    je suis un peu perdu là...

  15. #15
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Problème super résolu, oui ! Mais tag RESOLU toujours pas là

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Par défaut
    Citation Envoyé par jmfmarques
    Bravo !
    Tu y gagneras !
    Bien !
    Dans une semaine, tu seras apte à en aider d'autres
    Encore une fois merci pour ton aide et ton encouragement.
    Et comme dit le vieux adage : "la connaissance est la seule chose qui s'enrichit en la partageant"

  17. #17
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    mets le tag RESOLU ou on va tous se faire gronder !

  18. #18
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bon j'ai trouvé la solution au probléme initial .. dans l'aide en ligne excel... c'est un resume qu'il faut:

    Citation Envoyé par Aide en ligne excel
    On error Goto (...)
    Remarques

    En l'absence d'instruction On Error, toute erreur d'exécution est fatale ; un message d'erreur apparaît et l'exécution s'arrête.

    Un gestionnaire d'erreurs est "validé" lorsqu'il a été désigné par une instruction On Error ; le gestionnaire d'erreurs "actif" est un gestionnaire validé qui traite une erreur. Si une erreur se produit alors qu'un gestionnaire d'erreurs est actif (c'est-à-dire entre la ligne où survient une erreur et une instruction Resume, Exit Sub, Exit Function ou Exit Property), le gestionnaire d'erreurs de la procédure en cours ne peut gérer l'erreur. Le contrôle revient à la procédure appelante
    (..)
    tiens voila le code de hdidan modifié qui fonctionne... (même si pas trés joli)
    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
    Sub select_sheet()
     
    Dim Msg As String           ' Message du MsgBox
    Dim Title As String         ' Titre du MsgBox
    Dim Response As String      ' Réponse du MsgBox
     
    Début:
    ' Boîte de dialogue
     
        Msg = "Entrer le nom de la feuille"      ' Définit le message.
        Title = "Sélection de feuille"           ' Définit le titre.
        If Err.Number <> 0 Then Resume Suite
    Suite:
        Response = Application.InputBox(Msg, Title, Type:=2)
     
    If Response = "" Then
     
    GoTo Début
     
    End If
     
    If Response <> "Faux" Then
     
        On Error GoTo Début
     
        ActiveWorkbook.Sheets(Response).Select
     
    End If
     
    End Sub

  19. #19
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    en effet,, c'est carrément moche

    mais que fait le resume en plus du err.clear?

  20. #20
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par méphistopheles
    mais que fait le resume en plus du err.clear?
    ben comme c'est écrit dans le morceau d'aide en ligne plus haut (le 1° ) ... cela ne sert à rien d'appeller explicitement err.clear.. puisque l'appel de celui-ci est déjà efféctué par On Error Goto...

    sinon resume termine la gestion d'erreur en cours et permet d'en effectuer une autre ..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  2. [VBA-E] Structure de On Error
    Par skual dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/03/2006, 16h17

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