Multiple Erreur Handling incompréhension

Bonjour à toutes et à tous,

J'essaie de faire plusieurs erreurs handling cependant je pense qu'il me manque quelque chose.

Dans mon code ci-dessous, pourquoi mon Err2: se déclenche alors qu'il n'y a pas du tout d'erreur à ma ligne de code "Sheets(1).range("A2").select ?

Je dois peut-être mettre un resume mais j'ai dû mal à comprendre, j'aimerai pas que mon Err2 se déclenche s'il n'y a pas eu d'erreur dans ce processus.

Par contre si j'ai une Erreur dans le Err1 & Err2, j'aimerai qu'il fasse les deux codes prévus en cas de ces erreurs + continuer la suite du code.

Sub Multiple_erreur_handler()

Sheets(1).Range("A1").Select

On Error GoTo Err2

Sheets(1).Range("A2").Select

On Error GoTo Err1

Sheets(2).Select

Err1:

MsgBox ("Erreur 1")

Err2:

MsgBox ("Erreur 2")

End Sub

Bonjour

Essaie ainsi :

Option Explicit

Sub Multiple_erreur_handler()
    Sheets(1).Range("A1").Select
    On Error GoTo Err2
    Sheets(1).Range("A2").Select
    On Error GoTo Err1
    Sheets(2).Select
Err1:
    MsgBox ("Erreur 1")
    Exit Sub
Err2:
    MsgBox ("Erreur 2")
    Exit Sub
End sub

Bye !

Hello GMB,

j'y avais pensé mais le problème est que si j'ai les deux erreurs je n'aurai pas la suite du code qui est dans Err2, à cause du Exit SUB.

Re,

Pour faire très simple, j'ai un code, s'il n'a pas d'erreur, il continue sans faire les ErrHandler, s'il a 1 erreur il va a l'erreur Handler et fait le code puis continuer.

Mais dans le cas ou il a les deux erreurs Handler, j'aimerai qui les fasse les deux, puis continue également le code.

On ne peut pas statuer un début d'erreur et une fin d'erreur ?

Car le problème est que le Err1 englobe le Err2 ou inversement, quelque chose comme ça.

Alors ça, peut-être :

Option Explicit

Dim d&

Sub Multiple_erreur_handler()

    Sheets(1).Range("A1").Select
    On Error Resume Next 'GoTo Err2
    Sheets(1).Range("A2").Select
    '...
    '...
    d = 1 / 0       'exemple d'erreur
    If Err.Number <> 0 Then
        Err.Clear
        Call err1
    End If

    Sheets(2).Select
    '...
    '...
    MsgBox ("Erreur 2")
    d = 1 / 0       'exemple d'erreur
    If Err.Number <> 0 Then
        Err.Clear
        Call err2
    End If
    Exit Sub
err2:
    MsgBox ("Erreur 2")
    Call err2
    Exit Sub
End Sub

Sub err1()
    MsgBox ("Erreur 1")
    '...
    '...
End Sub

Sub err2()
    MsgBox ("Erreur 2")
    '...
    '...
End Sub

Bye !

Hello,

je pense que c'est un très bon début de piste, mais dans ce code si nous avons Err1, à aucun moment il va check Err2 ou inversement? Car dans ma procédure il se peut que j'ai un Err1 qu'il doit adapter, puis un Err2 plus loin qu'il doit adapter.

Sauf si j'ai mal lu ton code.

Je te remercie déjà pour ce très bon début.

Re,

Au fait mes erreurs sont des erreurs de Sheets.select, car parfois c'est Sheets("Feuil1") ou Sheets("Feuil3") ou Sheets(1) ou Sheets(2)... peut-on faire une condition IF pour analyser si la feuille existe peut-être ?

Sauf si j'ai mal lu ton code.

Ce doit être ça car quand tu as une instruction "call un sous programme", la macro décroche, va exécuter le sous programme puis revient continuer la macro initiale à partir de l'instruction qui celle où elle avait décrcoché.

Bye !

Il me faudrait donc une condition qui détecte si le document a bien cette feuille qui existe.

Malheureusement je ne peux pas me baser sur les noms des feuilles

As-tu un moyen de faire plusieurs if comme mon exemple ci-dessous ?

Je sais que le code n'existe pas, mais c'est pour imager.

If sheets(1).exist = True then

'code ici

end if

If sheets(2).exist = true then

'code ici

end if

etc..

Salut,

Null besoin de gestion d'erreur pour cela tu teste d'abords si la feuille existe

Sub TestExist()

    Dim ws As Worksheet
    Set ws = Worksheets("Feuil1")
    If GetIfSheetExist(ws) Then ws.Select
End Sub

Ou plus condensé

Sub TestExist()
    If GetIfSheetExist(Worksheets("Feuil1")) Then Worksheets("Feuil1").Select
End Sub

Et la fonction qui teste si la feuille existe. Que tu peut mettre au chaud dans un module

' // SheetExist By Jean-Paul (Valtrase) le : 15/12/2016
' // Teste si une feuille existe renvoie un boolean
Public Function GetIfSheetExist(ByVal stFeuille) As Boolean
    ' // Methode pour les non puristes qui utilise la méthode On Error
    '    On Error Resume Next
    '    SheetExist = Not (ThisWorkbook.Sheets(stFeuille) Is Nothing)
    Dim sh As Worksheet
    Dim bolExist As Boolean
    With ThisWorkbook
        For Each sh In .Worksheets
            If sh.Name = stFeuille Then bolExist = True
        Next
        SheetExist = bolExist
    End With

End Function

Salut Jean-Paul,

avec ça "Public Function GetIfSheetExist(ByVal stFeuille) As Boolean" tu crées une fonction ?

si c'est le cas, il faudrait juste la même chose mais sans passer par le nom, mais avec l'index. (par exemple Sheets(1), Sheets(2), Sheets(3), mais il y a aussi "Feuil3", ou des noms variables.

car ce sont des extractions qui changent.

Merci de tes recherches.

Re je viens de voir que tu ne peux pas utiliser les nom des feuilles mais leur CodeName oui.

Garde la première fonction qui te sera utile dans ta boite à outils (tu as une boite à outils ?)

Voici un fonction qui teste une feuille par son CodeName

Function GetSheetByCodeName(CodeName As String, Optional wkBook As Workbook) As Object
    Dim ws As Object
    If wkBook Is Nothing Then Set wkBook = ActiveWorkbook
    For Each ws In wkBook.Sheets
        If ws.CodeName = CodeName Then
            Set GetSheetByCodeName = ws
            Exit For
        End If
    Next ws
End Function

La fonction renvoie un Object qui peut être une feuille un graph ou autre. Et tu peux donc utiliser ses propriétés

et pour l'appel tu fais par exemple

Sub TestExist()
    Dim ws As Object
    Set ws = GetSheetByCodeName("Feuil6")
    If Not ws Is Nothing Then 
        Debug.Print ws.name
        ws.select
    End If
End Sub

re,

Je ne pense pas avoir une boîte à outil.

Je n'ai jamais eu de fonction je ne sais pas comment ça fonctionne et où la mettre.

Grâce à cette fonction je pourrais faire des conditions simples tels que : If sheets(1) exists then ... ?

D'avance merci

re,

Houlala oui faut lire les bases de VBA et VBE

  • Donc on va dans l'environnement VBE en faisant Alt + F11
  • Ensuite menu Insertion puis click sur Module
  • Tu peux et je te le conseille le renommer
  • Ensuite tu colles les fonctions dedans copier coller...
  • Voilà c'est fini

Maintenant tu peux utiliser les fonctions dans ton code

image image

ci-dessus ma boite à outils ...

Hello Jean-Paul,

J'avais mal compris ta réponse, évidemment que j'ai des modules ainsi qu'un Personnal etcc..

Cependant je n'avais encore jamais utilisé les "Function".

Donc je mets la première partie du code et ensuite dans le même module à la fin je mets le code "Function" ?

Car j'ai fait comme ça et ça ne fonctionne pas pour ma part, je ne peux pas "lancer le code".

Car ce que je voudrais tout simplement ce serait de mettre plusieurs conditions IF qui check toutes les possibilités et qui fait en fonction...

Ce serait pas plus simple ?

D'avance merci de vos retours.

Salut,

Comme un petit exemple vaut mieux que de longs discours...

Bonjour à toutes et à tous, Jean-Paul j'ai essayé avec les functions mais ça ne me convenait pas trop. Suite à de multiple recherche et tentative j'ai créé le code ci-dessous (J'ai un navigateur trop vieux je ne peux pas insérer le code comme d'hab...), ce code permet d'identifier via le nom de la feuille ou l'index si besoin. Dim exists As Boolean For i = 1 To Worksheets.Count If Worksheets(i).Name = "Feuil" & i Then exists = True MsgBox ("Feuil " & i & " Existe") '************test************** ElseIf Worksheets(i).Index = i Then exists = True MsgBox ("Index " & i & " Existe") '************test************** End If Next i

Re,

l'erreur est partie, voici le code dans un format correct :

Dim exists As Boolean

For i = 1 To Worksheets.Count

    If Worksheets(i).Name = "Feuil" & i Then
        exists = True

        MsgBox ("Feuil " & i & " Existe")

   '************test**************

        ElseIf Worksheets(i).Index = i Then

        exists = True

        MsgBox ("Index " & i & " Existe")
     '************test**************

    End If

Next i

Salut,

Si tu ne donnes pas de bonnes explications c'est normal que l'on tape à coté.

Il me faudrait donc une condition qui détecte si le document a bien cette feuille qui existe.

Malheureusement je ne peux pas me baser sur les noms des feuilles

Et d'après ce que je vois tu fais un test sur le nom de la feuille...

Personnellement je déconseille de sélectionner une feuille par son index, celui-ci pouvant changer à tous moments.

Ci dessous l'index pointe sur Feuil1

image image

Et ci-dessous l'index pointe sur Feuil2

image image

pour tester si un index existe tu peux le faire directement

image

Re,

Oui au fait là j'ai juste mis un exemple simple, mais étant donnée que j'ai des extractions de données variables de mon vieux système, il fait des vérifications par nom de feuille et une condition en AND avec une plusieurs vérifications sur l'index ! Car dans mon cas certains noms de feuille varient à chaque exportation ! Donc impossible de vérifier une feuille par nom.

Là j'ai juste fait un exemple simple pour les autres qui aimeraient checker une feuille existante par nom ou index facilement.

Rechercher des sujets similaires à "multiple erreur handling incomprehension"