IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

If .. ElseIf et GoTo .. Exit Sub [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut 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 : 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.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour horemheb,

    Je n'ai pas exactement la réponse à ta question cependant je souhaite simplement te dire que pour l'affichage simple d'erreur, l'utilisation des "GoTo" est à proscrire.
    En effet, l'utilisation de ces-derniers entraînent une génération de code dit "spaghetti" qui n'est jamais bon en programmation.

    De mon point de vu, il y a TOUJOURS une solution pour ne pas utiliser le GoTo. On me contredira peut-être sur ce point...

    Quoi qu'il en soit, évite systématiquement d'utiliser cela. Pense différemment la résolution de ton problème, passe par des fonctions, autre... mais n'utilise pas ces GoTo principalement dans ce genre de cas simple.

    Voila, je ne fais pas franchement avancer le schmilblick mais c'est un conseil !

    Cordialement,
    Kimy

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je joins la réflexion de Kimy_Ire

    Sinon, pour des conditions, ne pas écrire le "après" Then sur la même ligne (sauf s'il n'y a pas de Else ou Elsif)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Condition1 Then
       Msgbox "Msg1"
    ElseIf Condition2 Then
       Msgbox "Msg2"
    Else
       Msgbox "Msg3"
    End If

  4. #4
    Invité
    Invité(e)
    Par défaut Bonsoir,
    Pas besoin de ce prendre la tête pour ce genre de traitement pas besoin de ElseIf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Validation()
    'Test date d'arrivée
        If IsEmpty(Cells(16, 3).Value) Then MsgBox "Pas de date d'arrivée", 1, "Attention":  Exit Sub  'si la cellule est vide
       If Not IsDate(Cells(16, 3).Value) Then    MsgBox "Ne correspond pas au format jj/mm/aa", 1, "Attention" :   Exit Sub  'si la donnée n'est pas une date
        If Cells(16, 3).Value > Date Then  MsgBox "Erreur de date", 1, "Attention":  Exit Sub    'si la date est supérieure à aujourd'hui
    End Sub

  5. #5
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Merci pour vos réponses.
    D'un point de vue purement technique, effectivement, il suffit de passer à la ligne après le Then pour que ça fonctionne, bien que l'aide ne le spécifie pas clairement.
    Du point de vue structure du programme, je suis d'accord avec vous, les GoTo sont à proscrire. Cette façon d'utiliser les étiquettes n'est pas géniale, je vais revoir mon programme.
    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] UserForm et Exit Sub
    Par djoumusic dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/02/2010, 20h03
  2. différence entre end sub et exit sub
    Par TaymouWan dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/12/2009, 09h38
  3. [E-03] Problème Exit Sub
    Par allergique dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/10/2008, 21h51
  4. Problème d'Exit Sub
    Par DeaD78 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/06/2008, 09h53
  5. equivalent exit sub
    Par mapmip dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/03/2007, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo