Gestionnaire d'erreur

Bonjour

J'ai un probleme avec la macro suivante

on error goto S1

instructions 1

S1:

on error goto S2

instructions 2

S2:

on error goto S3

instructions 3

S3:

on error goto S4

instructions 4

S4:

instructions

....

Lorsque le code "instructions 1" génère une erreur le branchement s'effectue sur l'étiquette S1.

Cependant si le code "instructions 2" ou "instructions 3 " etc.. génère une erreur le branchement sur l'étiquette correspondante ne s'effectue pas et le code s’arrête.

En fait la première erreur est gérée correctement mais pas les suivantes.

Je n'arrive pas à résoudre ce problème. Quelqu’un aurait-il une piste ?

Merci pour votre aide

Bonjour,

Il faut arrêter chaque détournement du gestionnaire d'erreurs.

On Error Goto S1
instructions 1
On Error Goto 0
On Error Goto S2
instructions 2
On Error Goto 0
....
Exit Sub

S1:
Traitement de l'erreur 1
Exit Sub 
S2:
Traitement de l'erreur 2
Exit Sub
.... 
End sub

Sinon si tu ne traites pas les erreurs, utilises resume next :

On Error Resume Next
instructions 1
instructions 2
instructions 3
instructions 4
On Error Goto 0

Merci Patrice

Mon désir est de sauter certaine instructions lorsqu'une erreur se produit.

Le fait de réinitialiser le gestionnaire d'erreur par

on error goto 0

ne résout pas mon problème.

Tout dépends de la façon dont tu écris ton code, si tu conserves ton 1er code, le on error goto 0 doit être après le S1:

Voila le nouveau code. Cependant le résultat est le même.

on error goto S1

instructions 1

S1:

on error goto 0

on error goto S2

instructions 2

S2:

on error goto 0

on error goto S3

instructions 3

S3:

on error goto 0

on error goto S4

instructions 4

S4:

instructions

....

Bonjour,

C'est pas ce que je t'ai écrit !

Voici un exemple :

Sub test()
Dim v As String

  On Error GoTo E1
  v = InputBox("Erreur 1 : entrer 0")
  v = CStr(1 / Val(v))
  MsgBox "Pas d'erreur 1"
S1:
  On Error GoTo 0
  If v = "0" Then MsgBox "Erreur 1"
  On Error GoTo E2
  v = InputBox("Erreur 2 : entrer 0")
  v = CStr(1 / Val(v))
  MsgBox "Pas d'erreur 2"
S2:
  On Error GoTo 0
  If v = "0" Then MsgBox "Erreur 2"
Exit Sub

E1:
  Resume S1
E2:
  Resume S2

End Sub

bonjour,

On Error Goto n'est pas une technique de programmation structurée ! Mais une instruction de débogage...

Utilisez If... Select Case... et les propriétés habituelles pour la programmation ordinaire mais ne partez pas sur des idées à la Gaston...

A+

Merci Patrice

J'ai réécrit mon code selon ton exemple.

C'est parfait. Merci.


galopin01 a écrit :

bonjour,

On Error Goto n'est pas une technique de programmation structurée ! Mais une instruction de débogage...

Utilisez If... Select Case... et les propriétés habituelles pour la programmation ordinaire mais ne partez pas sur des idées à la Gaston...

A+

Dans mon cas le "if .. Select Case " ne résout pas le problème ou je ne sais pas le résoudre.

Après avoir appliqué un filtre dans un tableau. Il n'y a pas de données affichées.

Excel génère donc l'erreur dans cette ligne

X = Worksheets("Ecritures").Range("TabEcritures[Compte]").SpecialCells(xlCellTypeVisible).Count

Au lieu (ou avant) d'appliquer un filtre, testez directement les données...

Un filtre est rarement nécessaire en programmation : YAKA parcourir les données

For i = (début) to (Fin)
'et on parcourt toute la colonne...
Next

Si la colonne est très longue ou s'il y a plusieurs colonnes à lire on utilisera un Array ou un Dictionnary.

Bonjour,

Tu peux aussi écrire :

x = 0
On Error Resume Next
x = Worksheets("Ecritures").Range("TabEcritures[Compte]").SpecialCells(xlCellTypeVisible).Count
On Error GoTo 0
If x = 0 Then GoTo S1

Si le nombre de cellules masquées est très important, ce sera bien plus rapide que les vérifier une à une

Rechercher des sujets similaires à "gestionnaire erreur"