On Error GoTo [Résolu]

Signaler
Messages postés
11
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
31 juillet 2007
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour,
Voici mon code
' --------------------------------------
' Mise en forme du graph aerau
' --------------------------------------
    On Error GoTo Acou
    Sheets("Graph_aerau").Select
        With ActiveChart
            .HasTitle = True            If mm 1 Or mm - pp 1 Then
                .ChartTitle.Characters.Text = "Courbe réduite aéraulique de " & mm - pp & " ventilateur"
            Else
                .ChartTitle.Characters.Text = "Courbes réduites aérauliques de " & mm - pp & " ventilateurs"
            End If
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "delta'"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "mu"
            .ChartArea.Select
        End With
' --------------------------------------
' Mise en forme du graph acou
' --------------------------------------
Acou:
    On Error GoTo Finir
    Sheets("Graph_acou").Select
        With ActiveChart
            .HasTitle = True            If mm 1 Or mm - nn 1 Then
                .ChartTitle.Characters.Text = "Courbe réduite acoustique de " & mm - nn & " ventilateur"
            Else
                .ChartTitle.Characters.Text = "Courbes réduites acoustiques de " & mm - nn & " ventilateurs"
            End If
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "phi ouverture réduite'"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "lw dB(A)"
            .ChartArea.Select
        End With
    Sheets("Données").Select
Finir:
    Application.ScreenUpdating = True
End Sub

Voici mon poblème : quand je lance la Macro, il se peut que Graph_acou ou Graph_aerau n'existe pas. Par consequent j'ai une erreur qui apparaît. Je décide donc de passer à l'instruction suivante si cette erreur apparaît. Pour le premier graphe cela fonctionne, mais pas pour le deuxième graphe. J'ai la fenêtre d'erreur d'indice en dehors de la plage qui stoppe mon programme. Le problème viendrait-il du fait que je fais suivre 2 On Error GoTo à la suite ?

Merci d'avance

10 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
J'ai l'impression que je me suis trompré en effet de lien.

Voyons onc si ma mémoire de ce que j'avais lu dans le bon lien est bonne :

Sub listons_feuilles()
 Dim feuille
 For each feuille in ActiveWorkBook.Sheets
   msgbox feuille.name
 next
end sub

te donnerait les noms des feuille existantes

Reste à faire une fonction :

Private function coucou(nom_feuille as string) as boolean
      coucou = false
     dim feuille
     For each feuille in ActiveWorkBook.Sheets
           If feuille.name = nom_feuille then
                coucou = True
                 exit for
           End If
      next
End Function

et à appeler la vérification ainsi :

dim mon_nom as string
mon_nom = "feuille_supposee"
if coucou(mon_nom) then
     msgbox mon_nom & " est bien une feuille"
else
    msgbox mon_nom & " n'est pas une feuille"
end if

reste à savoir si mamémoire est bonne (je n'ai pas envie de rechercher à nouveau) mais il te suffit d'essayer, n'est-ce pas ?
Messages postés
59
Date d'inscription
lundi 21 août 2006
Statut
Membre
Dernière intervention
17 juillet 2009

Salut

Pour répoondes à ta question, je pense que ca ne pose pas de problème de mettre plusieurs gestion d'erreur au sein d'une même procédure.

Sur quelle ligne ton programme bug t il ?
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
Bonjour,

Je te suggère de faire quelques petits tests... de te gratter la tête... d'observer... et d'en tirer profit :

Test 1, donc :

Private Sub Command3_Click()
  On Error GoTo a
  Error = 3
  MsgBox "on va voir si je passe par là, hein ?"
a:
  On Error GoTo b
  MsgBox "je suis en a"
b:
  MsgBox "je suis en b"
End Sub

Examines bien et note tout !
Puis : test 2 :
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
Et zut...

Bon... voilà le test 2

:Private Sub Command3_Click()
  On Error GoTo a
  Error = 3
  MsgBox "on va voir si je passe par là, hein ?"
a:
  If Err Then GoTo b
  MsgBox "je suis en a"
b:
  MsgBox "je suis en b"
End Sub

tu vois la différence ?
Si oui... tu réfléchis... tu comprends... tu te sers de ces "subtilités"- là

Ceci étant dit : il est nettement préférable de ne passer par une gestion d'erreur que lorsqu'il est rigoureusement impossible de pouvoir écrire ce qui provoquerait une éventuelle erreur ! Bien évidemment !
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
Correction ! Lire :
ne passer par une gestion d'erreur que lorsqu'il est rigoureusement impossible de pouvoir écrire ce qui ne provoquerait pas une éventuelle erreur

Je ne connais pas VBA, mais il y a surement un moyen de vérifier l'existence ou non d'une feuille...(plutôt que de gérer une erreur sur son inexistence éventuelle)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
Ouais, apparemment :

Lire donc :

http://xlbysteph.free.fr/aideinformatique/xl_test_existence.htm

On y trouve ce qu'il faut pour tester cette existence et, donc, d'avoir à gérer une erreur ...
Messages postés
11
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
31 juillet 2007

-> Zakata : Mon prog bug à la ligne Sheets("Graph_acou").Select
En effet cette feuille n'existe pas. Mais ce que je ne comprends pas c'est pourquoi le On Error GoTo Finir situé juste au-dessus ne remarque pas qu'il y a un retour d'erreur.

->jmfmarques : je ne comprends pas ta ligne If Err Then GoTo b
Est-ce que Err est une fonction ???
Ton premier test fait la même chose, "je suis en a" et "je suis en b", qu'il y est On Error GoTo b ou non. J'ai déplacé b: en le remontant au dessus de MsgBox "on va voir si je passe par là, hein ?". le prog affiche "je suis en b". Du coup on peut en déduire qu'il n'y a pas d'erreur à la suite de "je suis en a".
Ton 2eme test file directement sur "je suis en b". Cela se comprend d'après l'ordre que tu as mis et si je passe la signification de ta condition.
Sinon merci pour le lien. J'avais déjà regardé ça, mais je pensais que c'était plus simple de passer par ma gestion d'erreur puisque je ne cherche pas à savoir si une feuille existe, mais plutôt à la mettre en forme si elle existe. Excel m'informant par une erreur qu'elle n'existe pas, autant se servir de ce retour.
D'ailleurs sur le lien que tu m'a donné, ils font la même chose que moi, il se servent du retour d'erreur.
Messages postés
11
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
31 juillet 2007

Juste une remarque, je ne sais pas pourquoi tu as listé les feuilles mais c'est pas grave, car le reste fonctionne.
C'est beaucoup plus rigoureux que de travailler avec les erreurs.
Bonne mémoire donc jmfmarques
Merci beaucoup
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
25
Je n'ai listé que pour te montrer le mécanisme...


L'appel de la fonction, par contre, ne liste pas et te renvoir True (si la feuille existe) ou False (si elle n'existe pas).
Dans ton appli, donc, tu ne fais la mise en Forme que si la feuille existe.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Maintenant que JMF t'a montré comment éviter cette gestion d'erreur, j'aurais 2 points concernant ton bout de code.

Premièrement, tu n'as pas mis de Exit Sub juste avant ton étiquette d'erreur " Acou: "
Donc, à chaque fois que tu actives cette procédure, tu y passeras.

Deuxièment, un peu comme te le démontraient les codes de JMF, tu entres dans la partie de gestion " Acou: ", et tu inscrit immédiatement d'aller vers " Finir: ", donc le code entre les 2 ne sera jamais exécuté...

Fin de la parenthèse...

MPi