If .. ElseIf et GoTo .. Exit Sub
Bonjour à tous,
J'ai un souci de compatibilité entre l'utilisation du If ... ElseIf ... EndIf et du GoTo ...Exit Sub. J'explique :
Dans un tableau Excel je rentre une date dans la cellule L16C3. Je mets en place un bouton associé à une macro qui va tester la validité de cette entrée et afficher un message adapté à l'erreur de saisie éventuellement faite.
D'abord je teste la présence d'une donnée, puis si c'est une date, puis si elle ne dépasse pas celle du jour. En cas d'erreur j'affiche un message adapté à l'erreur, je sélectionne la cellule concernée et je quitte par un Exit Sub.
Ce qui donne le code suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Sub Validation()
'Test date d'arrivée
'si la cellule est vide
If IsEmpty(Cells(16, 3).Value) Then GoTo Erreur1
'si la donnée n'est pas une date valide
ElseIf Not IsDate(Cells(16, 3).Value) Then GoTo Erreur2
'si la date est supérieure à aujourd'hui
ElseIf Cells(16, 3).Value > Date Then GoTo Erreur3
End If
Exit Sub
Erreur1:
MsgBox "Pas de date d'arrivée", 1, "Attention"
Cells(16, 3).Select
Exit Sub
Erreur2:
MsgBox "Ne correspond pas au format jj/mm/aa", 1, "Attention"
Cells(16, 3).Select
Exit Sub
Erreur3:
MsgBox "Erreur de date", 1, "Attention"
Cells(16, 3).Select
Exit Sub
End Sub |
Lors de l'exécution j'obtiens une erreur de compilation "Else sans If", ce qui n'est manifestement pas le cas.
Je suppose que les If ... ElseIf... End If ne font pas "bon ménage" avec les GoTo et Exit Sub. Pouvez-vous m'en dire plus à ce sujet ?
Comme les tests s'y prêtent j'ai contourné le problème avec des If ... Then sans Else, ce qui donne le code :
Code:
1 2 3 4 5 6 7
| 'Test date d'arrivée
'si la cellule est vide
If IsEmpty(Cells(16, 3).Value) Then GoTo Erreur1
'si la donnée n'est pas une date valide
If Not IsDate(Cells(16, 3).Value) Then GoTo Erreur2
'si la date est supérieure à aujourd'hui
If Cells(16, 3).Value > Date Then GoTo Erreur3 |
Je sais, ça va vous paraître bizarre, je pose un problème et je donne une solution. Ce que je souhaite c'est comprendre pourquoi la première solution ne fonctionne pas et comment peut-on la faire fonctionner.
Merci de m'éclairer sur ce point.