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 :

On error Goto


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 41
    Par défaut On error Goto
    Bonjour tout le monde,

    J'utilise un gestionnaire d'erreur qui me permet de modifier des paramètres et de repartir dans le programme principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    On Error GoTo gererlerreur
    'programme principal
    ...
    reprise:
    ...
    gererlerreur:
    'modifie des paramètres et renvoie vers le programme
    ...
    Goto reprise
    Mon problème est la suivant : je me sers de ma macro pour faire une campagne de simulations sur un autre programme. Elle me permet de modifier des paramètres de l'autre programme et de lancer simulations. Je rencontre des problème de convergence dans certains cas, c'est pour ça que j'ai créé cette gestion d'erreur. Quand il n'y a qu'un seul problème dans mon programme, ce gestionnaire d'erreur marche très bien. Par contre quand il y a un deuxième problème, il ne suffit pas et un message d'erreur apparaît. Ma question est la suivante :
    - existe-t-il un moyen de modifier la gestion d'erreur en fonction du nombre de fois qu'on l'utilise? J'ai essayé de mettre en place un compteur mais en fait au bout de la deuxième erreur, la macro s'arrête au milieu et ne va pas jusqu'au gestionnaire d'erreur...

    J'espère avoir été assez clair...

    Bien cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    C'est assez difficile à dire car en ne voyant pas le code dans son entièreté on ne sait pas si il faut réinitialiser le gestionnaire ou gérer les différentes erreurs par rapport à leur numéro ?
    Tu peux essayer avec Err.Clear pour "vider" le gestionnaire.

    Hervé.

  3. #3
    Membre chevronné
    Avatar de bifconsult
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2012
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 189
    Par défaut
    Citation Envoyé par Theze Voir le message
    Tu peux essayer avec Err.Clear pour "vider" le gestionnaire.
    J'ai déjà eu le cas et Err.Clear n'a pas aidé. Je n'avais d'ailleurs pas trouvé de solution directement adéquate et j'ai recodé une partie.

    J'ai trouvé cette solution sur le forum:
    --> ICI <--

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 41
    Par défaut
    Bonjour à tous et merci pour vos réponses.

    Tout d'abord j'ai essayé cette solution :
    Citation Envoyé par Theze Voir le message
    Bonjour,

    C'est assez difficile à dire car en ne voyant pas le code dans son entièreté on ne sait pas si il faut réinitialiser le gestionnaire ou gérer les différentes erreurs par rapport à leur numéro ?
    Tu peux essayer avec Err.Clear pour "vider" le gestionnaire.

    Hervé.
    Et malheureusement, au bout de la deuxième erreur, j'ai toujours le même problème. En tout cas merci pour cette commande que je ne connaissais pas...

    Du coup, j'ai essayé la deuxième proposition :
    Citation Envoyé par Nicopilami Voir le message
    Bonjour tu peux faire un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    on error resume next
     
    Err.clear
    [instruction 1]
    if Err.number<>0 then
           'gestion erreur 1
    endif
     
    Err.clear
    [instruction 2]
    if Err.number<>0 then
           'gestion erreur 2
    endif

    bye
    Nicolas
    Et là, je ne peux pas faire un :
    car j'ai besoin de retourner dans ma boucle en modifiant des données.
    Du coup j'ai testé avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On Error Goto gestionderreur
    Et là, j'ai toujours le même problème...

    En tout cas, merci pour vos propositions!

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut

    alors, si tu as 2 erreurs, il faut non pas les catcher via le on error, mais en amont faire les tests de blindage nécessaires pour ne pas que les erreurs surviennent

    Tu as des exemples d'erreurs que tu gères ainsi pour l'instant ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Et avec "Resume" ?
    Un petit exemple avec erreurs générées par l'abscence des feuilles Feuil5 et Feuil4 dans un classeur nouvellement créé :
    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
     
    Sub Erreur()
     
        Dim I As Integer
        Dim J As Integer
     
        I = 5
     
        On Error GoTo gererlerreur
        'programme principal
        '...
     
        'si seulement les 3 feuilles d'origines, 2 erreurs
        'seront générées (Feuil5 et Feuil4 n'existant pas)
        Worksheets("Feuil" & I).Select
        MsgBox "OK, plus d'erreur !" '<-- suite du code à la place...
     
        Exit Sub 'évite la gestion des erreurs ci-après
     
        'reprise: <-- peut être supprimé
     
    gererlerreur:
     
        J = J + 1
        MsgBox "Erreur n° " & J & " !"
     
        I = I - 1 '<-- modification des paramètres...
     
        Resume '<-- à la place de l'embranchement "reprise"
        'GoTo reprise
     
    End Sub
    Hervé.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 41
    Par défaut
    Citation Envoyé par jpcheck Voir le message

    alors, si tu as 2 erreurs, il faut non pas les catcher via le on error, mais en amont faire les tests de blindage nécessaires pour ne pas que les erreurs surviennent

    Tu as des exemples d'erreurs que tu gères ainsi pour l'instant ?
    Alors je vais essayé d'être le plus clair et concis possible :
    le but de ma macro : gérer des simulations sur un autre programme
    par quel moyen : j'ai créé un objet qui est reconnu dans VBA et qui permet d'être manipulé
    comment ça marche : je fait varier des paramètres (2 pour être précis : Q et alpha), je leur attribue des valeurs dans une sub puis j’appelle une autre sub qui fait tourner mon programme. Mon programme consiste à créer un nombre de modules inconnu par avance. Pour chacun des modules, je dois trouver la valeur d'un paramètre A qui répond à mes contraintes. Le problème, c'est que je dois initialiser à chaque création de module mon paramètre A dans mon programme. Mes erreurs sont toujours du même type (le numéro de l'erreur est 189). Elles correspondent au moment où j'ai un problème de simulation dans mon programme. Du coup, dans ce cas, j'utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On Error Goto gestionerreur
    dans lequel je modifie l'initialisation de mon paramètre A. Mon problème étant quand dans la même série de simulation je rencontre un autre problème (à un autre module par exemple).

    je vous mets un exemple de mon problè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
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    Sub simulation_module()
    'recup le nom du  fichier
      nom_fichier = Worksheets(1).Cells(1, 2).Value
      file = Application.ActiveWorkbook.Path + "\" + nom_fichier
      Set Prog = GetObject(file)
     
    ...
    'gestion d'erreur
    On Error GoTo ErrorHandler
    ...
    'Mex = nombre de modules
    For Mex = 2 To 30
     
        tampon = alpha / (Qeau + 1)
     
    'zone où je reprends après l'erreur  
    reprise:
     
    'boucle If pour voir si je réponds à mes critère
        If critère 1 non rempli Then
     
           'création d'un nouveau module
           'j'initialise ma valeur A
           Prog.Module(CStr(Mex)).A.Value = tampon
     
    ' :aie:c'est dans cette partie que je peux avoir des problèmes de convergence
    'du coup, j'ai tout simplement lancer plusieurs simulations en rentrant les valeurs des paramètres étape après étape
            'on lance la simulation
            Prog.Application.Simulation.Run (True)
     
            'on fixe d'autres paramètres
            Prog.Module(CStr(Mex)).Q.Value = Qeau
            Prog.Module(CStr(Mex)).alpha.Value = alpha
     
            'on lance la simulation
            Prog.Application.Simulation.Run (True)
     
            'On fixe d'autres paramètres...
            ...
     
            'on lance la simulation
            Prog.Application.Simulation.Run (True)
     
            'deuxième boulce if pour le deuxième critère
                If critère 2 est rempli Then
                ...
                goto ok2
                Else
                ...
                goto ok2
                End If
     
            End If
     
     
     
       'si c'est bon on envoie vers la gestion ok
        ElseIf critère 1 rempli  Then
     
            'je fixe des paramètres, en relâche d'autres, ... là il n'y a pas d'erreur
          ...
            Prog.Application.Simulation.Run (True)
         GoTo ok
        'normalement si c'est la premiere il faut sortir de la boucle if
     
        End If
     
     
    'gestion du cas qui marche avec critère 2
    ok2:
    compteur2 = 0
     
    'on rajoute un petit module
    Next Mex
     
    'gestion du cas qui marche avec critère 1
    ok:
     
    'traitement des données : j'appelle des sub pour traiter les données
    Call save
    Call ecriture
     
    Exit Sub
     
    ErrorHandler:
     
    'je supprime un module et je diminue l'aire minimum
    Prog.Application.Simulation.flowsheet.removeblock CStr(Mex)
    tampon = 5
    Err.Clear
    GoTo reprise
     
    End Sub
    Alors j'ai essayé d'épurer au maximum mon programme... Si c'est vraiment pas clair, n'hésitez pas!

    Merci encore pour tous vos messages!

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Hum, et n'est-il pas envisageable de récupérer une valeur de type booléenne par exemple qui indique si la routine s'est bien déroulée comme prévue, avec une gestion simplifiée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If not laroutinequejelanceetmeretournetruefalse Then
    'cas de l'erreur
    Else
    'rien on continue le code
    End If
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre éclairé Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Par défaut
    Bonjour tu peux faire un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    on error resume next
     
    Err.clear
    [instruction 1]
    if Err.number<>0 then
           'gestion erreur 1
    endif
     
    Err.clear
    [instruction 2]
    if Err.number<>0 then
           'gestion erreur 2
    endif

    bye
    Nicolas

Discussions similaires

  1. pourquoi on error goto ne fonctionne qu'une seule fois ?
    Par alsimbad dans le forum Général VBA
    Réponses: 9
    Dernier message: 05/09/2014, 12h09
  2. pb avec "On error goto"
    Par malingue dans le forum Access
    Réponses: 9
    Dernier message: 20/06/2006, 19h54
  3. [vb6]On Error goto 0
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/04/2006, 20h04
  4. 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
  5. [VBA-E]Pb "On Error GoTo"
    Par hdidan dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 04/04/2006, 18h41

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