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

  1. #1
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    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 éclairé 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
    Points : 827
    Points
    827
    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.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  3. #3
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    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 éclairé 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
    Points : 827
    Points
    827
    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é.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  5. #5
    Membre à l'essai
    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
    Points : 19
    Points
    19
    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 éprouvé
    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
    Points : 1 124
    Points
    1 124
    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 expérimenté
    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
    Points : 1 562
    Points
    1 562
    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
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  8. #8
    Membre éclairé 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
    Points : 827
    Points
    827
    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.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  9. #9
    Membre à l'essai
    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
    Points : 19
    Points
    19
    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 éprouvé
    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
    Points : 1 124
    Points
    1 124
    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

  11. #11
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    Par défaut
    Nako_Lito
    J'ai testé Unload.Me , le message d'erreur suivant apparaît
    "Erreur de compilation
    Argument non Facultatif"
    De plus Exit Sub ne résout pas mon problème comme j'avais pu le penser.
    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

  12. #12
    Membre éclairé 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
    Points : 827
    Points
    827
    Par défaut
    Unload Me et pas Unload.me. avec un espace, pas un point.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  13. #13
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour,
    J'ai testé avec Unload Me cela efface les données de mon UserForm, ce que je ne souhaite pas.
    Cela ne résout pas mon problème qui est que:
    à la fin de ma macro (j'ai vérifié en pas à pas) lorsque j’atteins la dernière procédure (la 14ème pour moi) le curseur passe par End Sub de cette procédure puis sur les End Sub des procédures par lesquelles je suis passé avant, et revient dans la boucle qui m'a permis de vérifier la validité de la date sur le End If.
    Comme ce End if se trouve au début d'une procédure intermédiaire, eh bien le programme repasse à la ligne et reprends la macro depuis cette procédure intermédiaire et ainsi de suite.
    J'ai tenté d'isoler ces lignes de contrôle dans une procédure spécifique appelée depuis une autre procédure mais mon problème reste le même, je reboucle sur ma macro.
    En fait je sais pas gérer correctement ma (mes) boucles...
    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

  14. #14
    Membre éclairé 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
    Points : 827
    Points
    827
    Par défaut
    Citation Envoyé par eric4459 Voir le message
    Bonjour,
    J'ai testé avec Unload Me cela efface les données de mon UserForm, ce que je ne souhaite pas.
    Oui, c'est normal, c'est pourquoi j'avais avertis sur l'importance de stocker les données des controles dans des variables.

    Pour en revenir a ton post original.
    Tu disais :

    Quand valider est activé :
    - vérifie la validité des données
    - si non ok
    attends qu'il y ai une rectification
    reprend la boucle
    - fin si

    pourquoi ne pas plutot faire une méthode qui teste les valeurs et si elle trouve qqc qui va pas, avertis l'utilisateur et sort de la procédure ?
    Tu vas t'épargner bien des tracas.
    Par ce que dans ton code actuel, par exemple, j'ai mes 8 champs texte : je remplis les 5 premiers champs avec des bonnes données et le 6eme avec un truc qui va pas, le programme me dit qu'il faut changer le champ 6, mais si je modifie les 5 premier en mauvais et le 6 en bon, il se passe quoi ?

    La validation des données d'un formulaire est primordial en programmation. Il faut que tu revalide toutes les données a chaque fois que l'utilisateur modifie qqc. Tu ne peux pas prendre pour acquis que ce qui est déjà inscrit reste bon.
    Qui plus est quand tu as des champs conditionnel, par exemple, en fonction d'une date ou d'une case a cocher tout ca tout ca.

    Le plus simple pour toi :
    Une seule boucle qui vérifie tous les champs un par un.
    Appuis sur le bouton "valider" -> vérifie champs par champs -> Y'a une erreur -> avertissement -> sort de la boucle et de la méthode de validation (programme arrêté)-> modification faite par l'utilisateur -> Appuis sur le bouton "valider" -> recommence le cycle
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  15. #15
    Membre à l'essai
    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
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Nako_lito Voir le message

    Le plus simple pour toi :
    Une seule boucle qui vérifie tous les champs un par un.
    Appuis sur le bouton "valider" -> vérifie champs par champs -> Y'a une erreur -> avertissement -> sort de la boucle et de la méthode de validation (programme arrêté)-> modification faite par l'utilisateur -> Appuis sur le bouton "valider" -> recommence le cycle
    Pour faire ce que NAKO cite, j'ai fait ce code (si tu as regardé mon classeur comme je te l'avais conseillé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim VariTexte: Dim Compt01
    VariTexte = "": Compt01 = 0
     
    If TextBox1.Text = "" Then VariTexte = VariTexte & Chr(10) & "Saisir TB1"
    'etc TB2, 3 4
    If ComboBox1.ListIndex = -1 Then VariTexte = VariTexte & Chr(10) & "Saisir Combobox"
     
    For T = 7 To 13
        If Userform1.Controls("Label" & T).Caption = "" Then Compt01 = 1
    Next T
    If Compt01 <> 0 Then VariTexte = VariTexte & Chr(10) & "Choisir une référence dans la listbox"
     
     
    If VariTexte <> "" Then MsgBox VariTexte: Exit Sub
    Après si tu veux que des chiffres dans tes TextBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If IsNumeric(Me.TextBox3.Text) = False Then MsgBox "Saisir 12 chiffres uniquement": _
            Me.TextBox3 = "": Me.TextBox3.SetFocus: Exit Sub
     If Len(Me.TextBox3.Value) < 12 Then MsgBox "Saisir 12 chiffres": _
            Me.TextBox3 = "": Me.TextBox3.SetFocus: Exit Sub
    Et si tu veux qu'on ne saisisse que la date du jour avec la veille et le lendemain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Teste le format de ma date
     
        If IsDate(Me.TextBox1.Text) = False Then MsgBox "Entrez une date au format suivant : jj/mm/aa": _
            Me.TextBox1 = "": Me.TextBox1.SetFocus: Exit Sub
     
        If DateValue(TextBox1.Text) <= (Date - 2) Then MsgBox "Entrez une date supérieure à deux jours": _
            Me.TextBox1 = "": Me.TextBox1.SetFocus: Exit Sub
     
        If DateValue(TextBox1.Text) >= (Date + 2) Then MsgBox "Entrez une date inférieure à deux jours": _
            Me.TextBox1 = "": Me.TextBox1.SetFocus: Exit Sub
    J'espère que ça t'aidera et tout ceci est intégré dans un CommandButton Valider

  16. #16
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    Par défaut
    Merci à tous,
    Je bloque encore sur mon problème, aussi je joint le fichier à ce message.
    C'est un peu une "Usine à Gaz".
    Mon problème se situe sur le module2.
    Pour tester le comportement il faut:
    afficher l'onglet "Actual" qui est masqué et effacer la donnée en F12 (je n'ai pour l'instant codé que pour la textbox1 qui se trouve sur l'UserForm "Milestone_Edit")
    Mettre un point d’arrêt sur MsgBox "End" de la procédure nommée "actual"
    Lancer la macro en cliquant sur le bouton "Update Progress" de l'onglet "Physical_Progress"
    A l'invite entrer une date (pour mon test j'utilise 01/07/2017) puis sélectionner dans la fenêtre qui s'ouvre ensuite l'équipement "PLEMs".
    A l'ouverture de l'UserForm entrer pour le TextBox1 (Actual Date du jalon "Contract Award") soit une date au format jj/mm/aa ou une date supérieure à la date entrée précédemment 02/08/2017 par exemple
    Puis regarder ce qui se passe en mode pas à pas.
    Merci pour votre aide
    Eric
    PROGRESS REPORT FOR PROCUREMENT pour Developpez.xlsm
    "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

  17. #17
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    Par défaut
    Merci à tous pour votre aide sur ce sujet
    J'ai résolu, de façon peu orthodoxe je l'avoue, mon problème en ajoutant une condition.
    Mon problème était que ma macro recommençait même après avoir cliqué sur un MsgBox "End" apparaissant à la fin de mon code.
    J'ai donc fais passer à 1 la valeur d'une cellule après avoir cliqué sur le bouton OK du MsgBox "End" et à 0 lorsque je lance la macro .
    Si cette cellule est égale à 0, j’exécute toutes les procédures si elle est à 1, le programme se termine de façon classique.
    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

  18. #18
    Membre expérimenté
    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
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    J'ai essayé de regarder votre code mais j'ai plein d'erreur, du style.
    En regardant un peu le module 2.... oui, ça me semble compliqué sans y passer quelques heures .... et j'avoue que je m'y perds.
    Si votre solution marche, .... et bien, tant mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Module Baseline
     
    Debug.Print Err.Number, Err.Description
     1004         The cell or chart that you are trying to change is protected and therefore read-only.
     
    To modify a protected cell or chart, first remove protection using the Unprotect Sheet command (Review tab, Changes group). You may be prompted for a password.
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  19. #19
    Membre éprouvé
    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
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour Vincent,
    J'ai essayé de regarder votre code mais j'ai plein d'erreur

    Effectivement j'ai oublié de retirer la protection de la feuille Baseline avant envoi du fichier

    Sinon le programme fonctionne comme je le souhaites malgré sa complexité, le but initial étant de comparer les tableaux dans les onglets Baseline et Actual, de construire les courbes et de mettre en évidence les différences.
    Au fur et à mesure de sa construction j'ai ajouté d'autres morceaux de code soit pour résoudre les problèmes auxquels je n'avais pas pensé au début soit pour éviter la mauvaise utilisation.
    Merci pour ton implication
    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

  20. #20
    Membre éclairé 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
    Points : 827
    Points
    827
    Par défaut
    Au fur et à mesure de sa construction j'ai ajouté d'autres morceaux de code soit pour résoudre les problèmes auxquels je n'avais pas pensé au début soit pour éviter la mauvaise utilisation.
    Je ne porte aucun jugement quant a la manière de faire, et je comprend tout à fait que dans la vraie vie on soit plus souvent tenté de faire des correctif à la volée plutôt que ré-analyser le projet dans l'ensemble pour apporter des modifications qui ne seront pas des patchs de patchs.

    Juste garder qqc en tête, le gain de temps que le patch semble faire gagner est une chimère, car au fil du temps, l'accumulation de tout le temps que tu vas passer pour faire des correctif ou même, comprendre ce que tu avais fait, dépassera largement le temps d'analyse que tu aurais fais initialement.

    Content que ton projet fonctionne comme tu le souhaite.
    Bonne continuation.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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