Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Excel203 : Gestion d'erreur défaillante

6 réponses
Avatar
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

6 réponses

Avatar
michdenis
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" a écrit dans le message de groupe de
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
Avatar
Stan37
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" a écrit dans le message de groupe de
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

Avatar
michdenis
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
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

Avatar
Stan37
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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
>
Avatar
michdenis
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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
>
Avatar
Stan37
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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" a écrit dans le message de groupe de
> > 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
> >