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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.