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 :

Problème de boucle après correction d'une mauvaise entrée dans un TextBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut Problème de boucle après correction d'une mauvaise entrée dans un TextBox
    Bonjour à tous,

    Dans la macro que j'ai créé (merci à tous ceux qui ont contribué à résoudre certaines difficultés), je vérifie ce qui a été saisi dans les TextBox's et demande à l'utilisateur de recommencer la saisie en cas de mauvaise entrée.
    En fonctionnement normal, si l'utilisateur a saisi une entrée correcte, la macro fonctionne parfaitement.
    Dès lors qu'une entrée est erronée, le code mis en place averti l'utilisateur et lui demande de corriger et une fois l'erreur corrigée la macro reprend son cours.
    Le problème est que, dans ce cas, après exécution des toutes les Subs du programme, je reviens dans la partie du code qui vérifie la saisie sur la ligne End Sub, ce qui est normal, puis entre à nouveau dans ce code sur un End If.
    C'est ce comportement que je ne comprends pas, je dois avoir oublié quelque chose, mais quoi???
    J'ai bien en tête l'utilisation de
    Exit Sub
    pour me faciliter les choses mais cela ne me convient pas puisque le programme devrait s’arrêter sans cet artefact.

    Voici la partie du code concernée, après un passage par la ligne 31 lors de la phase de fin du programme le code passe à nouveau par la ligne 15, puis 16 etc..

    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
    28
    29
    30
    31
    Private Sub Close_Form_Click()
    Dim B As Variant
    Dim Act As Worksheet
    Dim TB1 As Variant
    Set Act = ThisWorkbook.Sheets("Actual")
     B = MsgBox("Do you want to save the data ?", vbYesNoCancel + vbExclamation, WARNING)
                If B = vbYes Then
                   If Milestone_Edit.TextBox1.Value <> "" And Len(Milestone_Edit.TextBox1.Text) < 10 Then
                    TB1 = MsgBox("Date Format must be" & vbCr & "dd/mm/yyyy", vbOKOnly, "WARNING")
                        If TB1 = vbOK Then
                            Me.Hide
                            Milestone_Edit.TextBox1 = ""
                            Milestone_Edit.TextBox1.SetFocus
                            Milestone_Edit.Show
                        End If
                   End If
                   Me.Hide
                   TextBox1_Value
                   'Milestone_Edit.Show
                   Update_Actual
                   actual
                ElseIf B = vbNo Then
                   Me.Hide
                   Milestone_Edit.Show
                ElseIf B = vbCancel Then
                   B = MsgBox("Update Cancelled", vbOKOnly)
                   Me.Hide
                   Exit Sub
     
                End If
    End Sub
    Un conseil éclairé serait le bienvenu.

    Merci pour votre aide et votre collaboration
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  2. #2
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    A quoi servent tout tes me.hide ? Hide ne ferme pas un formulaire, il le cache. Si tu veux fermer un formulaire, c'est unload(me) suivit d'un exit sub (ou exit function) qui conviendrait mieux.

  3. #3
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonjour,
    Je cherche à cacher les UserForm pour ne pas polluer l'écran.
    Mais mon problème ne vient pas de là me semble-t-il, ce qui m'ennui c'est qu'au lieu de terminer une procédure j'entre à nouveau dedans.
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    pourquoi les cacher ? est ce que tu as des données a conserver quand l'écran est masqué ?
    Si tu n'as aucune info a conserver ou que tu ne peux pas stocker dans une variable globale, ferme l'écran. Plus propre, plus rapide, plus sur. Un écran caché continue a interférer avec le programme, si il y a des événement définit dans le code, ils continuent a être actif.

    je pense au contraire que ton problème vient de là, ma première pensée quand j'ai lu ton problème -> récursivité.

  5. #5
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut
    Je ne suis pas une pro, mais je crois que elseif ne s'utilise qu'une fois dans une boucle.
    If then elseif
    Si alors sinon.

    Là tu fais 2 fois sinon. Dans ton cas il faudrait des select case, je crois.

    C'est la traduction pour t'aider. Après je ne procède pas comme toi pour bloquer un opérateur. Une Msgbox apparait et il modifie, sinon il ne peut pas valider.

    Si tu es intéressé dis le moi

  6. #6
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Nako_Lito
    Tu me conseilles donc de remplacer Me.Hide par Unload.Me, c'est ça?
    Eric


    Bonjour Keithingel,
    Je crois que l'on peut utiliser plusieurs fois ElseIf dans une boucle ou une procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Si X= A alors 
    Action 1
    Sinon Si X=B alors
    Action 2
    Sinon Si X=C alors
    Action 3
    etc..
    End if
    Sinon , qu'entends tu par "bloquer un opérateur"? et que fais-tu?
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Vous pouvez faire quelque chose du style (à adapter):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         While (IsDate(InDate)) = False
            InDate = Application.InputBox("Date?): (Cancel to exit)", " reference date", Type:=2)
            If InDate = "False" Then Exit Sub
            If IsDate(InDate) Then ArchDate = DateValue(InDate)
        Wend

  8. #8
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    pour répondre au deux intérogations précédentes :

    Je ne suis pas une pro, mais je crois que elseif ne s'utilise qu'une fois dans une boucle.
    If then elseif
    Si alors sinon.
    Non, on peut utiliser autant de elseif qu'on souhaite dans une boucle. Il faut juste faire attention aux tests effectués

    Tu me conseilles donc de remplacer Me.Hide par Unload.Me, c'est ça?
    Tout à fait !

    Pense a stocker les données du formulaire si jamais il y a en que tu veux faire passer d'un formulaire à l'autre.
    Fait suivre ton Unload.me d'un exit sub pour terminer l'écran sur le champ.

    Ceci dit, je ne sais pas trop a quoi ressemble ton programme, mais si tu n'as qu'un formulaire a l'écran, cela va mettre un terme a ta macro.

  9. #9
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut
    J'entends que s'il ne rentre pas ce que je lui demande où s'il oublie de renseigner un textbox il ne peux pas continuer.
    Après pour avertir je fais comme ceci (c'est pour le bouton annuler mais tu peux le mettre où tu veux) à adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Bouton_Annuler_Click()
     
    Dim T1 As Variant, T2 As Variant
     
     
    T1 = "Toutes les données saisies seront effacées."
    T2 = "Êtes-vous sûr de vouloir annuler ?"
    If MsgBox(T1 & Chr(10) & Chr(10) & T2, vbYesNoCancel + vbCritical, "Abandon de la procédure") = vbNo Then Exit Sub
     
    Unload Me 'Ferme mon userform
    '-------------------------------------------------------------------------------------------------------
     
     
    End Sub
    S'il clique oui ça annule tout et quitte le programme. S'il clique non ça revient sur l'userform.
    Ce ne serait pas plus simple ?

    Le plus simple va voir mon classeur. Car j'ai une multitude de code pour bloquer un utilisateur et je t'expliquerai certains points si tu veux t'inspirer.
    http://www.developpez.net/forums/d14...-optionbutton/

  10. #10
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Citation Envoyé par vinc_bilb Voir le message
    Bonjour,

    Vous pouvez faire quelque chose du style (à adapter):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         While (IsDate(InDate)) = False
            InDate = Application.InputBox("Date?): (Cancel to exit)", " reference date", Type:=2)
            If InDate = "False" Then Exit Sub
            If IsDate(InDate) Then ArchDate = DateValue(InDate)
        Wend
    Bonjour Vincent,
    En fait mon UserForm est composé de 16 TextBox (2 rangées de 8).
    La première rangée comporte les dates de réalisation planifiées de 8 événements, dans la deuxième l'utilisateur doit saisir la date réelle de réalisation de l'événement lors de la mise à jour mensuelle d'un projet.
    Je souhaite que le format de date entré soit identique au format d'une date qui se trouve ailleurs afin de pouvoir les comparer.
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/03/2014, 22h02
  2. [AC-2010] Problème d'espace après exécution d'une requete en VB
    Par cocols59 dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/07/2012, 15h06
  3. stoppez boucle apres affichage d'une form
    Par lovedesitaliens dans le forum C#
    Réponses: 1
    Dernier message: 09/08/2010, 11h33
  4. problème d'affichage après execution d'une macro
    Par ptitemar dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/08/2007, 17h45
  5. Réponses: 12
    Dernier message: 26/04/2007, 15h02

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