Avis pour instruction On Error GoTo
Bonsoir le forum,
Pour ma première utilisation de l'instruction On Error GoTo j'aimerai juste avoir votre point de vue sur sa (bonne j'espère...) utilisation dans mon code.
A priori tout fonctionne, mais je voudrai simplement avoir votre avis et savoir si je ne suis pas passé à côté de quelque chose d'important. En effet dans la base réelle c'est plusieurs centaines de lignes que je passe en revue.
Dans le fichier essai ci-joint vous aurez un aperçu de la strucure de la feuille de données dans laquelle je fais la recherche et l'intégralité de la macro (qui ne fonctionne pas dans cet essai)
Dans la base réelle, je veux connaître les paiements (demandés, payés, ou rétrocédés) en rentrant une date de début et une date de fin dans un userform. J'en fais ensuite le total pour l'afficher dans une autre feuille.
J'ai décidé d'utiliser "On Error..." quand je me suis aperçu qu'il y avait souvent des erreurs de saisie dans les dates, et qu'inévitablement l'utilisateur se retrouve dans le code VBA.
Je peux ainsi faire apparaitre un message d'erreur qui signale la ligne sur laquelle se trouve l'erreur.
'Depuis la dernière ligne jusqu'à la ligne 6
For I = LastRow To 6 Step -1
On Error GoTo 1
'Si la date de facturation du client est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3MTDPRO
If CDate(Sheets("2009Paiements").Cells(I, 5)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 5)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 5)) <= CDate(EP3_DFIN) Then
EP3MTDPRO = EP3MTDPRO + Sheets("2009Paiements").Cells(I, 6).Value
End If
'Si la date de paiement du client est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3MTPRO
If CDate(Sheets("2009Paiements").Cells(I, 7)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 7)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 7)) <= CDate(EP3_DFIN) Then
EP3MTPRO = EP3MTPRO + Sheets("2009Paiements").Cells(I, 8).Value
End If
'Si la date de rétrocession du client est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3RETROPRO
If CDate(Sheets("2009Paiements").Cells(I, 10)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 10)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 10)) <= CDate(EP3_DFIN) Then
EP3RETROPRO = EP3RETROPRO + Sheets("2009Paiements").Cells(I, 11).Value
End If
'Si la date de facturation du payeur est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3MTDPAY
If CDate(Sheets("2009Paiements").Cells(I, 15)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 15)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 15)) <= CDate(EP3_DFIN) Then
EP3MTDPAY = EP3MTDPAY + Sheets("2009Paiements").Cells(I, 16).Value
End If
'Si la date de paiement du payeur est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3MTPAY
If CDate(Sheets("2009Paiements").Cells(I, 17)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 17)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 17)) <= CDate(EP3_DFIN) Then
EP3MTPAY = EP3MTPAY + Sheets("2009Paiements").Cells(I, 18).Value
End If
'Si la date de rétrocession du payeur est saisie et comprise entre EP3_DDEBUT et EP3_DFIN j'ajoute sa valeur à EP3RETROPAY
If CDate(Sheets("2009Paiements").Cells(I, 20)) > 0 And CDate(Sheets("2009Paiements").Cells(I, 20)) >= CDate(EP3_DDEBUT) And CDate(Sheets("2009Paiements").Cells(I, 20)) <= CDate(EP3_DFIN) Then
EP3RETROPAY = EP3RETROPAY + Sheets("2009Paiements").Cells(I, 21).Value
End If
cptEP3 = cptEP3 + 1
Next
Sheets("2009PTDate").Select
Range("C6").Value = EP3_DDEBUT
Range("C7").Value = EP3_DFIN
Range("E9").Value = EP3MTDPRO
Range("E10").Value = EP3MTPRO
Range("E11").Value = EP3RETROPRO
Range("J9").Value = EP3MTDPAY
Range("J10").Value = EP3MTPAY
Range("J11").Value = EP3RETROPAY
Application.ScreenUpdating = True
Range("A2").Select
Exit Sub
1
Sheets("PAccueil").Select
Application.ScreenUpdating = True
MsgBox ("Erreur de saisie ligne " & I & " .Veuillez rectifier avant de relancer le traitement")
End SubMerci à tous ceux et celles qui prendront le temps de parcourir le code.
Cordialement
Joseph
Bonjour
Tu dis que ton code ne fonctionne pas
Mais avec une base de données vide pas évident de tester
Je vois que tu testes si la cellule est > 0 : A mon avis c'est inutile vu que tu testes ta cellule entre des limites, qui sont, elles > 0
Tu boucles sur toutes les lignes de la fin jusqu'à la ligne 6 (Pourquoi la ligne 6 ?)
Pourquoi ne pas faire un SOMMEPROD (Je n'ai pas testé si c'est plus facile à transcrire la formule) ?
Bonjour le forum, banzai,
Merci de ta réponse, de plus je suis bien content de te "retrouver" dans ce post.
J'ai refait (un peu) mon fichier exemple en rajoutant quelques données et en déplacant l'entête comme dans ma base.
Tu pourra donc constater pourquoi je boucle jusqu'à la ligne 6 : c'est la première à contenir les données.
La plupart des erreurs de saisie se font au niveau des dates (dans le fichier exemple en E8) mais on peut toujours également imaginer que dans une colonne qui doit contenir un montant on mette autre chose qu'un chiffre.
C'est pourquoi j'ai décidé d'introduire l'instruction On Error dans mon code VBA.
Et comme c'est une première pour moi j'ai voulu un regard extérieur pour voir si je n'avais pas fait de grosse bêtise.
Je vois que tu as remarqué que je teste si la date est supérieure à 0. Je ne le faisais pas avant et effectivement celà semble inutile.
En gros, le principe est le suivant
L'utilisateur saisi une date de début et de fin dans un userform.
Le code fait la somme de tous les enregistrements correspondants à ces critères et en fait le total sur une autre feuille qui s'affiche en fin de traitement.
En rajoutant l'instruction On Error le code va stopper, revenir à la page d'accueil et afficher à l'utilisateur un message lui indiquant sur quelle ligne de la feuille "Saisie/Modification des Paiements" , l'erreur à été trouvée au lieu de "bugger" et afficher le code VBA.
Merci de ta réflexion.
Amicalement
Joseph
Bonjour
J'avais compris le fonctionnement
Mais toujours pour tester ce n'est pas avec ces quelques données que l'on pourra faire des tests
Manque les pages "2009Paiements" (elle c'est 'Feuil1'), "2009PTDate","PAccueil"
L'userform pour récupérer les dates de début de de fin
Sinon je ne vois pas d'erreur dans ce code
Si une erreur est détectée le code s'arrête en indiquant la ligne
Bonjour Banzai, le forum
Merci, c'est tout ce que je voulais savoir.
Les tests que j'ai fait montrent que tout semble parfaitement fonctionner, je souhaitais juste un regard sur mon code...au cas où...
Le fichier c'était juste pour montrer à quoi tout ceci ressemble.
La base est bien trop importante pour que je puisse la joindre, et pour en ôter toutes les données confidentielles...ça ne serait pas de la tarte.
Encore merci
Joseph