Excel203 : Gestion d'erreur défaillante

Le
Stan37
Bonjour,

Dans la portion de code suivante, qui parcourt une feuille, le "On Error
GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
ne vois pas bien pourquoi.

Le problème persiste même si je réinitialise le gestionnaire d'erreur
(err.clear).

L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
Merci par avance pour toute aide.
Claude Barbier

On Error GoTo nexterr
i = 2
tot = 0
Do While i < 60000
' On sort dés que col 1 vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
Else
If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
Then
If Compare(val3, Worksheets(onglet).Cells(i, col3)) =
True Then
tot = tot + 1
End If
End If
End If
End If
nexterr:
i = i + 1
Loop
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #21320031
Bonjour,

Essaie comme ceci :

'-------------------------------------
Sub test()
Dim i as Integer ' Ou Long
Dim NextErreur As String
On Error GoTo NextErreur

Ton code

Exit Sub

NextErreur:
Err.Clear
i = i + 1
Resume Next
End Sub
'-------------------------------------



"Stan37" discussion :
Bonjour,

Dans la portion de code suivante, qui parcourt une feuille, le "On Error
GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
ne vois pas bien pourquoi.

Le problème persiste même si je réinitialise le gestionnaire d'erreur
(err.clear).

L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
Merci par avance pour toute aide.
Claude Barbier

On Error GoTo nexterr
i = 2
tot = 0
Do While i < 60000
' On sort dés que col 1 vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
Else
If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
Then
If Compare(val3, Worksheets(onglet).Cells(i, col3)) True Then
tot = tot + 1
End If
End If
End If
End If
nexterr:
i = i + 1
Loop
Stan37
Le #21321201
Merci pour cette solution qui permet de ne plus sortir en erreur, mais cela
ne résoud pas complétement mon problème car le "Resume Next" fait qu'on
continue à exécuter le code comme si le if Compare(....) avait rendu un
"TRUE".
"tot" est incrémenté et le résultat final n'est pas bon, il faudrait que
lorsqu'il y a une erreur on passe à l'item suivant de la boucle Do.

"michdenis" wrote:

Bonjour,

Essaie comme ceci :

'-------------------------------------
Sub test()
Dim i as Integer ' Ou Long
Dim NextErreur As String
On Error GoTo NextErreur

Ton code

Exit Sub

NextErreur:
Err.Clear
i = i + 1
Resume Next
End Sub
'-------------------------------------



"Stan37" discussion :
Bonjour,

Dans la portion de code suivante, qui parcourt une feuille, le "On Error
GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
ne vois pas bien pourquoi.

Le problème persiste même si je réinitialise le gestionnaire d'erreur
(err.clear).

L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
Merci par avance pour toute aide.
Claude Barbier

On Error GoTo nexterr
i = 2
tot = 0
Do While i < 60000
' On sort dés que col 1 vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
Else
If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
Then
If Compare(val3, Worksheets(onglet).Cells(i, col3)) > True Then
tot = tot + 1
End If
End If
End If
End If
nexterr:
i = i + 1
Loop

michdenis
Le #21321191
Pour répondre adéquatement à ta question, il faudrait savoir
qu'elle est la ligne de code susceptible de générer une erreur
et qu'elle est le résultat que tu désires obtenir ?

Une autre suggestion irait comme suit :

En début de procédure,

On error resume next

Immédiatement après la ligne de code suscitant une erreur possible :
'--------------------
If err <>0 then
err.clear
Else
i = i + 1
End if
'--------------------
Ou l'inverse selon ce que tu tentes d'évaluer.




"Stan37" discussion :
Merci pour cette solution qui permet de ne plus sortir en erreur, mais cela
ne résoud pas complétement mon problème car le "Resume Next" fait qu'on
continue à exécuter le code comme si le if Compare(....) avait rendu un
"TRUE".
"tot" est incrémenté et le résultat final n'est pas bon, il faudrait que
lorsqu'il y a une erreur on passe à l'item suivant de la boucle Do.

"michdenis" wrote:

Bonjour,

Essaie comme ceci :

'-------------------------------------
Sub test()
Dim i as Integer ' Ou Long
Dim NextErreur As String
On Error GoTo NextErreur

Ton code

Exit Sub

NextErreur:
Err.Clear
i = i + 1
Resume Next
End Sub
'-------------------------------------



"Stan37" discussion :
Bonjour,

Dans la portion de code suivante, qui parcourt une feuille, le "On Error
GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
ne vois pas bien pourquoi.

Le problème persiste même si je réinitialise le gestionnaire d'erreur
(err.clear).

L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
Merci par avance pour toute aide.
Claude Barbier

On Error GoTo nexterr
i = 2
tot = 0
Do While i < 60000
' On sort dés que col 1 vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
Else
If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
Then
If Compare(val3, Worksheets(onglet).Cells(i, col3)) > True Then
tot = tot + 1
End If
End If
End If
End If
nexterr:
i = i + 1
Loop

Stan37
Le #21321341
Merci pour ton aide, ta réponse m'a mis sur la voie de la solution, j'ai
compacté mes "if" en une seule ligne et maintenant je n'incrémente que si err
est différent de 0.

On Error Resume Next

i = 2
tot = 0
Do While i < 60000
' On sort dés que Id courant vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
ElseIf Compare(val1, Worksheets(onglet).Cells(i, col1)) = True And _
Compare(val2, Worksheets(onglet).Cells(i, col2)) = True And _
Compare(val3, Worksheets(onglet).Cells(i, col3)) = True And _
Compare(val4, Worksheets(onglet).Cells(i, col4)) = True And _
Compare(val5, Worksheets(onglet).Cells(i, col5)) = True Then
If Err = 0 Then tot = tot + 1
End If
i = i + 1
Loop


"michdenis" wrote:

Pour répondre adéquatement à ta question, il faudrait savoir
qu'elle est la ligne de code susceptible de générer une erreur
et qu'elle est le résultat que tu désires obtenir ?

Une autre suggestion irait comme suit :

En début de procédure,

On error resume next

Immédiatement après la ligne de code suscitant une erreur possible :
'--------------------
If err <>0 then
err.clear
Else
i = i + 1
End if
'--------------------
Ou l'inverse selon ce que tu tentes d'évaluer.




"Stan37" discussion :
Merci pour cette solution qui permet de ne plus sortir en erreur, mais cela
ne résoud pas complétement mon problème car le "Resume Next" fait qu'on
continue à exécuter le code comme si le if Compare(....) avait rendu un
"TRUE".
"tot" est incrémenté et le résultat final n'est pas bon, il faudrait que
lorsqu'il y a une erreur on passe à l'item suivant de la boucle Do.

"michdenis" wrote:

> Bonjour,
>
> Essaie comme ceci :
>
> '-------------------------------------
> Sub test()
> Dim i as Integer ' Ou Long
> Dim NextErreur As String
> On Error GoTo NextErreur
>
> Ton code
>
> Exit Sub
>
> NextErreur:
> Err.Clear
> i = i + 1
> Resume Next
> End Sub
> '-------------------------------------
>
>
>
> "Stan37" > discussion :
> Bonjour,
>
> Dans la portion de code suivante, qui parcourt une feuille, le "On Error
> GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
> au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
> ne vois pas bien pourquoi.
>
> Le problème persiste même si je réinitialise le gestionnaire d'erreur
> (err.clear).
>
> L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
> à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
> Merci par avance pour toute aide.
> Claude Barbier
>
> On Error GoTo nexterr
> i = 2
> tot = 0
> Do While i < 60000
> ' On sort dés que col 1 vide
> If Worksheets(onglet).Cells(i, 1) = "" Then
> Exit Do
> Else
> If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
> If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
> Then
> If Compare(val3, Worksheets(onglet).Cells(i, col3)) > > True Then
> tot = tot + 1
> End If
> End If
> End If
> End If
> nexterr:
> i = i + 1
> Loop
>
michdenis
Le #21321561
Il y a un problème avec ta procédure ...

Si une erreur est générée, Err.Number <>0
si Err.Number n'est pas remis à zéro, même si la ligne
de code est Ok, Err.Number sera toujours <> 0




"Stan37" discussion :
Merci pour ton aide, ta réponse m'a mis sur la voie de la solution, j'ai
compacté mes "if" en une seule ligne et maintenant je n'incrémente que si err
est différent de 0.

On Error Resume Next

i = 2
tot = 0
Do While i < 60000
' On sort dés que Id courant vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
ElseIf Compare(val1, Worksheets(onglet).Cells(i, col1)) = True And _
Compare(val2, Worksheets(onglet).Cells(i, col2)) = True And _
Compare(val3, Worksheets(onglet).Cells(i, col3)) = True And _
Compare(val4, Worksheets(onglet).Cells(i, col4)) = True And _
Compare(val5, Worksheets(onglet).Cells(i, col5)) = True Then
If Err = 0 Then tot = tot + 1
End If
i = i + 1
Loop


"michdenis" wrote:

Pour répondre adéquatement à ta question, il faudrait savoir
qu'elle est la ligne de code susceptible de générer une erreur
et qu'elle est le résultat que tu désires obtenir ?

Une autre suggestion irait comme suit :

En début de procédure,

On error resume next

Immédiatement après la ligne de code suscitant une erreur possible :
'--------------------
If err <>0 then
err.clear
Else
i = i + 1
End if
'--------------------
Ou l'inverse selon ce que tu tentes d'évaluer.




"Stan37" discussion :
Merci pour cette solution qui permet de ne plus sortir en erreur, mais cela
ne résoud pas complétement mon problème car le "Resume Next" fait qu'on
continue à exécuter le code comme si le if Compare(....) avait rendu un
"TRUE".
"tot" est incrémenté et le résultat final n'est pas bon, il faudrait que
lorsqu'il y a une erreur on passe à l'item suivant de la boucle Do.

"michdenis" wrote:

> Bonjour,
>
> Essaie comme ceci :
>
> '-------------------------------------
> Sub test()
> Dim i as Integer ' Ou Long
> Dim NextErreur As String
> On Error GoTo NextErreur
>
> Ton code
>
> Exit Sub
>
> NextErreur:
> Err.Clear
> i = i + 1
> Resume Next
> End Sub
> '-------------------------------------
>
>
>
> "Stan37" > discussion :
> Bonjour,
>
> Dans la portion de code suivante, qui parcourt une feuille, le "On Error
> GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
> au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
> ne vois pas bien pourquoi.
>
> Le problème persiste même si je réinitialise le gestionnaire d'erreur
> (err.clear).
>
> L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
> à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
> Merci par avance pour toute aide.
> Claude Barbier
>
> On Error GoTo nexterr
> i = 2
> tot = 0
> Do While i < 60000
> ' On sort dés que col 1 vide
> If Worksheets(onglet).Cells(i, 1) = "" Then
> Exit Do
> Else
> If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
> If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
> Then
> If Compare(val3, Worksheets(onglet).Cells(i, col3)) > > True Then
> tot = tot + 1
> End If
> End If
> End If
> End If
> nexterr:
> i = i + 1
> Loop
>
Stan37
Le #21321691
Ok, donc, il faut en plus remettre err.number à zéro. merci pour ce complément.
Claude Barbier


"michdenis" wrote:

Il y a un problème avec ta procédure ...

Si une erreur est générée, Err.Number <>0
si Err.Number n'est pas remis à zéro, même si la ligne
de code est Ok, Err.Number sera toujours <> 0




"Stan37" discussion :
Merci pour ton aide, ta réponse m'a mis sur la voie de la solution, j'ai
compacté mes "if" en une seule ligne et maintenant je n'incrémente que si err
est différent de 0.

On Error Resume Next

i = 2
tot = 0
Do While i < 60000
' On sort dés que Id courant vide
If Worksheets(onglet).Cells(i, 1) = "" Then
Exit Do
ElseIf Compare(val1, Worksheets(onglet).Cells(i, col1)) = True And _
Compare(val2, Worksheets(onglet).Cells(i, col2)) = True And _
Compare(val3, Worksheets(onglet).Cells(i, col3)) = True And _
Compare(val4, Worksheets(onglet).Cells(i, col4)) = True And _
Compare(val5, Worksheets(onglet).Cells(i, col5)) = True Then
If Err = 0 Then tot = tot + 1
End If
i = i + 1
Loop


"michdenis" wrote:

> Pour répondre adéquatement à ta question, il faudrait savoir
> qu'elle est la ligne de code susceptible de générer une erreur
> et qu'elle est le résultat que tu désires obtenir ?
>
> Une autre suggestion irait comme suit :
>
> En début de procédure,
>
> On error resume next
>
> Immédiatement après la ligne de code suscitant une erreur possible :
> '--------------------
> If err <>0 then
> err.clear
> Else
> i = i + 1
> End if
> '--------------------
> Ou l'inverse selon ce que tu tentes d'évaluer.
>
>
>
>
> "Stan37" > discussion :
> Merci pour cette solution qui permet de ne plus sortir en erreur, mais cela
> ne résoud pas complétement mon problème car le "Resume Next" fait qu'on
> continue à exécuter le code comme si le if Compare(....) avait rendu un
> "TRUE".
> "tot" est incrémenté et le résultat final n'est pas bon, il faudrait que
> lorsqu'il y a une erreur on passe à l'item suivant de la boucle Do.
>
> "michdenis" wrote:
>
> > Bonjour,
> >
> > Essaie comme ceci :
> >
> > '-------------------------------------
> > Sub test()
> > Dim i as Integer ' Ou Long
> > Dim NextErreur As String
> > On Error GoTo NextErreur
> >
> > Ton code
> >
> > Exit Sub
> >
> > NextErreur:
> > Err.Clear
> > i = i + 1
> > Resume Next
> > End Sub
> > '-------------------------------------
> >
> >
> >
> > "Stan37" > > discussion :
> > Bonjour,
> >
> > Dans la portion de code suivante, qui parcourt une feuille, le "On Error
> > GoTo nexterr:" fonctionne correctement lors du premier cas d'erreur, mais pas
> > au second ou il y a une sortie "brutale" et la fonction rend "#VALEUR!", je
> > ne vois pas bien pourquoi.
> >
> > Le problème persiste même si je réinitialise le gestionnaire d'erreur
> > (err.clear).
> >
> > L'erreur intervient lorsque Worksheets(onglet).Cells(i, col3) fait référence
> > à une cellule dans laquelle une fonction Excel renvoie un cas d'erreur.
> > Merci par avance pour toute aide.
> > Claude Barbier
> >
> > On Error GoTo nexterr
> > i = 2
> > tot = 0
> > Do While i < 60000
> > ' On sort dés que col 1 vide
> > If Worksheets(onglet).Cells(i, 1) = "" Then
> > Exit Do
> > Else
> > If Compare(val1, Worksheets(onglet).Cells(i, col1)) = True Then
> > If Compare(val2, Worksheets(onglet).Cells(i, col2)) = True
> > Then
> > If Compare(val3, Worksheets(onglet).Cells(i, col3)) > > > True Then
> > tot = tot + 1
> > End If
> > End If
> > End If
> > End If
> > nexterr:
> > i = i + 1
> > Loop
> >
Publicité
Poster une réponse
Anonyme