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 :

Contrôles sur UserForm qui ne fonctionnent pas !


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut Contrôles sur UserForm qui ne fonctionnent pas !
    Bonjour à tous,
    J'ai un souci sur l'APPLI que j'aie créée en VBA avec des UserForm.

    Pour expliquer le mode de fonctionnement de mon appli, vous trouverez ci-après les étapes des traitements qui sont peut-être un peu longues mais à mon avis essentielles à la bonne compréhension du déroulement :

    - Saisie des données dans UserForm1
    - Certains champs sont contrôlés à la saisie par des procédures (ex : Private Sub VTxtHeure_Change())
    - Sur bouton "Valider" des contrôles se font sur les champs à saisie obligatoire
    - Quand tout est OK les données sont enregistrées sur une feuille "Données"

    Jusque-là tout va bien !

    - Ensuite, le chef de service doit valider ces fiches. Pour cela, il rappelle les données dans l'Userform2 par le biais d'un double-clic dans un UserForm dédié à la sélection
    - J'ai donc créé un Module dans lequel j'ai une variable pour chaque champ (ex pour le même champ : Public ValidHeure As String) et à l''Initialize()" de l'UserForm2, le champ = la variable (ex: VTxtHeure.Value = ValidHeure)
    - La variable à ce moment prend les données de la feuille "Données" (ex : ValidHeure = Format(Sh.Range("D" & .List(.ListIndex, 4)), "hh:mm"))
    - Tout s'affiche correctement et au bon endroit.
    - Si tout est OK, il valide la fiche et un document s'affiche pour imprimer cette dernière.
    - Les données sont retransférées dans la feuille 'Données"

    En revanche, si certains champs doivent être corrigés, et c'est là qu'apparaît Mon souci, dans l'Userform2 les contrôles à la saisie ne s'appliquent pas.
    J'ai recopié le même code que dans l'UserForm1 en changeant les noms de champ mais rien n'y fait !
    A titre d'exemple, je vous mets ci-dessous le code sur le champ Heure des 2 UserForm.

    Userform1
    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
    Private Sub TxtHeure_Change()
     
        On Error Resume Next
        Dim Texte As String
        Texte = TxtHeure.Text
     
        Select Case Len(Texte)
        Case 2
            If CInt(Texte) > 23 Then
                Texte = ""
            Else
                Texte = Texte & ":"
            End If
        Case 5
            If CInt(Right(Texte, 2)) > 59 Then
                MsgBox ("Vous avez saisi des minutes supérieures à 59")
                Texte = ""
            End If
        End Select
     
        TxtHeure.Text = Texte
        On Error GoTo 0
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TxtHeure_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        If InStr("1234567890,:", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep: MsgBox ("Ne saisir que des chiffes (4 obligatoires) et pas les ':' ! Si pas d'heure, tapez '00:00'.")
     
    End Sub
    UserForm2
    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
    Private Sub VTxtHeure_Change()
     
        On Error Resume Next
        Dim vTexte As String
        vTexte = VTxtHeure.Text
     
        Select Case Len(vTexte)
        Case 2
            If CInt(vTexte) > 23 Then
                vTexte = ""
            Else
                vTexte = vTexte & ":"
            End If
        Case 5
            If CInt(Right(vTexte, 2)) > 59 Then
                MsgBox ("Vous avez saisi des minutes supérieures à 59")
                vTexte = "" 'Left(Texte, 3)
            End If
        End Select
     
        VTxtHeure.Text = vTexte
        On Error GoTo 0
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub VTxtHeure_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        If InStr("1234567890,:", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep: MsgBox ("Ne saisir que des chiffes (4 obligatoires) et pas les ':' ! Si pas d'heure, tapez '00:00'.")
     
    End Sub
    Sur mon UserForm2, lorsque je veux changer l'heure, je n'ai pas de contrôle sur les chiffres saisis et les ":" ne s'affichent pas dès que les 2 premiers chiffres ont été saisis.
    Sur les autres champs, les contrôles en saisie ne se font pas également, en revanche, ceux sur le bonton 'Valider" fonctionnent bien… ????

    Je vous remercie d'avoir pris le temps de tout lire et de votre aide à venir.
    Je suis prêt à répondre à vos questions pertinentes.
    Cordialement

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 56
    Points : 82
    Points
    82
    Par défaut
    Salut,

    Question qui va paraitre inutile mais qui m'a déjà planté : es tu sûr que la textbox s'appelle bien Vtxt_Heure? Si le programme ne rentre pas dans ton sub, il y a fort à parier que c'est ça.

    Si c'est bon, met le On error resume next en commentaire pour voir si il y a une erreur quelque part.

    A+

    Captain

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour CaptainMeta,

    Mon champ est bien nommé VTxtHeure (et non Vtxt_Heure comme tu le mentionnes) et le fait de mettre en commentaire le On Erreur ne fait rien.
    Lorsque je modifie mon champ dans l'UserForm2, je peux mettre n'importe quoi dans ce champ et aucun contrôle ne se fait sur le changement ou la sortie. ????

    Pour palier pour l'instant ce pb de contrôle à la saisie, j'ai mis des contrôles supplémentaires dans mon bouton 'Valider'.

    Dans l'attente d'autres propositions,
    Cordialement

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    En lisant ton code il semble que ton controle n'est effectué seulement lorsque la valeur saisie comporte 2 ou 5 caractères ..du coup tu peu saisir n'importe quoi du moment que la longueur de la chaine soit differente de 2 et de 5..

  5. #5
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, pas tout lu, est-ce que Obliger une saisie numérique dans une TextBox peut t'aider ?

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Les contrôles ne se font pas ou ils ne se font pas correctement?

    Pour vérifier, place un point d'arrêt en début d'une de tes procédures _Change() ou _KeyPress() et fais des essais.
    Tu sauras, pour le moins, si le contrôle se fait ou pas.
    Cordialement,
    Franck

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je dirai qu'il ne te faudrait utiliser qu'une seule de ces procédures et je partirai plutôt sur "KeyPress" (voir même peut être "KeyDown"), cette dernière (KeyPress) se produisant avant "Change", il est fort possible que les deux évènements survenant l'un tout de suite après l'autre génère des problèmes !

  8. #8
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour à tous pour chacune de vos idées.

    Pour répondre à pijaku, les contrôles ne se font pas et pas uniquement sur l'exemple du champ VTxtHeure mais également sur tous les autres champs.
    Les seuls contrôles qui s'exécutent sont ceux mis sur le bouton 'Valider'.
    Les contrôles à la saisie eux ne fonctionnent pas... ?????

    Pour Theze : dans ce cas, pourquoi ces contrôles fonctionnent correctement dans mon UserForm1 ?

    Pour Kiki29 ; non, car dans le cas en exemple, alors que je n'autorise que les chiffres et le ";", j'ai mis des lettres en faisant des tests et aucun message d'erreur en saisie et à la sortie du champ (hormis par mon bouton 'Valider')

    Pour résumer et selon ma déduction, je pense que cela vient du fait que tous mes champs de cet UserForm2 se remplissent par les variables du module1 et par Initialize() à l'ouverture de l'UserForm.
    Maintenant, pourquoi les contrôles à la saisie ne fonctionnent pas ? là, j'aimerais bien savoir.
    Je continue à chercher tant que....

    Merci pour vos autres idées
    Cordialement

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    fait cela dans l'ordre vérifie que tes événement fonctionne en rajoutant par exemple un msg box

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub VTxtHeure_Change()
     
    msgBox  VTxtHeure.Text

  10. #10
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour bbil,

    Merci pour ton aide.
    C'est un cas concret qui, je n'en doute pas, devrait être une formalité pour toi.

    J'ai mis le MsgBox() comme tu me l'as demandé et je me retrouve dans le même cas de figure d'il y a peu, à savoir, que tout les MsgBox() mis dans mes contrôles à la saisie apparaissent systématiquement AVANT que mon userform2 ne s'affiche.

    J'ai lancé mon UserForm en pas à pas détaillé et effectivement, arrivé à l'Initialize(), mes champs sont bien remplis par mes variables mais à chaque champ, il effectue le contrôle sur le Change()
    A titre d'exemple, les opérations suivantes à chaque pression de F8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Initialize()
    
        VTxtDate.Value = ValidDate
        VTxtHeure.Value = ValidHeure
        VTxtNomM.Value = ValidNomM
        VTxtPrenomM.Value = ValidPrenomM
        .../...
    Dès que je suis en jaune sur la ligne en gras ci-dessus, je presse F8 et j'arrive sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub VTxtDate_Change()
        Dim Valeur As Byte
        VTxtDate.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
        Valeur = Len(VTxtDate)
        If Valeur = 2 Or Valeur = 5 Then VTxtDate = VTxtDate & "/"
    End Sub
    Ensuite, dès que je suis sur et que je presse F8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VTxtHeure.Value = ValidHeure
    j'arrive sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub VTxtHeure_Change()
    et ainsi de suite.

    Après, si je veux modifier les données d'un champ une fois mon UserForm2 chargé, aucun contrôle ne s'effectue.
    Ce qui est étrange, c'est qu'ils sont fonctionnels à l'Initialize() mais plus après ??????

    Est-ce que cela pourrait-être dû au fait que mon Private Sub UserForm_Initialize() se situe quasiment en bas du Code de mon UserForm ?
    Et tous les autres contrôles au dessus ?

    Merci pour la suite
    Cordialement

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Est-ce que cela pourrait-être dû au fait que mon Private Sub UserForm_Initialize() se situe quasiment en bas du Code de mon UserForm ?
    Absolument pas, où qu'il soit positionné, le compilateur c'est faire le tri des proc évènementielles à exécuter.
    Montre le code "Initialize" entièrement pour voir car effectivement, c'est étrange que les évènements soient déclenchés à l'initialisation et plus par la suite ?

  12. #12
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour Theze,

    Mon code Initialize() est comme mentionné dans mon post de 05h35 soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub UserForm_Initialize()
     
        VTxtDate.Value = ValidDate
        VTxtHeure.Value = ValidHeure
        VTxtNomM.Value = ValidNomM
        VTxtPrenomM.Value = ValidPrenomM
        .../...
    End Sub
    Il n'y dans ce code que le chargement des champs, rien d'autre !
    Je suis également surpris et j'aimerais bien avoir l'explication logique à ce problème.
    Je cherche toujours.

    Cordialement

  13. #13
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Les ".../..." en fin de procédure signifie qu'il y a encore du code ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Personnellement j'ai jamais compris l'intérêt de valider le contenu d'un textebox au fur et à mesure de la saisie!

    Si encore tu valisais à la perte de focus!

  15. #15
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour Theze,

    Affirmatif, les .../... signifie qu'il y a d'autres lignes de code derrière pour alimenter tous mes champs.

    Bonjour rdurupt,

    le contrôle à la saisie sur certain textBox permette, dans le cas de mon exemple VTxtHeure, de mettre un ':' après les 2 premiers chiffres et entre autre de n'autoriser la saisie que des chiffres.
    Mais les champs que j'ai mis dans mon exemple, ne sont effectivement que des TextBox alors que j'ai aussi des ComboList.
    Or, ces ComboList ne devrait pas autoriser la saisie de n'importe quelle lettre ou chiffre mais uniquement les items de ma liste.
    Ce n'est pas ce qui se passe actuellement.

    1 exemple
    Sur ce code, si je ne saisis pas une valeur de ma liste, j'ai un message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CBAnesthé_Change()
     
    If CBAnesthé.ListIndex = -1 Then
        MsgBox ("Sélectionner un Anesthésiste parmi la liste proposée ou laisser le champ vierge.")
        Me.CBAnesthé.SetFocus
        Exit Sub
    End If
     
    End Sub
    Or, sur mon UserForm2, je peux saisir n'importe quoi dans ce champ, je n'ai ni le contrôle ni le message d'erreur.

    Merci pour la suite
    Cordialement

  16. #16
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Pour les combobox, tu as la propriété "MatchRequired" qui ne permet de saisir que les valeurs de la liste, le contrôle est fait sur la perte du focus !
    Pour les TextBox, tu peux utiliser Exit avec Like en mettant Cancel à True pour empêcher la sortie, un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
        If TextBox1.Text Like "[0-9][0-9]:[0-9][0-9]" = False Then
     
            MsgBox "Vous devez saisir les heures sous la forme 12:30 !"
            Cancel = True
     
        End If
     
    End Sub

  17. #17
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Re bonjour Theze,

    Tu m'excuseras, mais on dévie du problème que je rencontre.
    En effet, mes contrôles à la saisie sont bien présents, fonctionnent sur mon UserForm1 mais pas sur mon UserForms2 et je souhaiterais savoir pour quelles raisons !

    Les solutions que tu me donnes sont positionnées sur mon bouton 'VALIDER' et fonctionnent. Donc je suis en partie soulagé car mes champs seront remplis sans erreur (statistiques derrière !)

    En revanche, je peux être confronté à une perte réelle de temps si plusieurs champs doivent être modifiés et si à l'intérieur de ces champs tu peux saisir n'importe quoi, d'où mes fameux contrôles à la saisie.

    Je suis donc dans l'attente d'autres tests à effectuer.

    Merci encore
    Cdt

  18. #18
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    As-tu testé en reconstruisant un nouvel UserForm pour voir si le problème persiste ?
    As-tu mis en commentaire tout le code "Initialize" pour voir si il y a une possibilité que ça vienne de là ?

  19. #19
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour Theze,

    Non, je n'ai pas exploré ces pistes mais déjà recréer l'UserForm serait long vu le nombre de champ et surtout sa conception.
    Je vais tester de mettre en commentaire l'Initialize() mais je ne saisi pas la raison.
    Mes champs ne seront pas remplis mais peut-être que les contrôles s'exécuteront quand même ??
    Je teste et te tiens informé.

    En revanche, j'ai testé les propositions sur le champ en Exit et le contrôle à ce moment s'exécute mais le Setfocus ne s'effectue pas.
    Si je mets Cancel = True, effectivement je ne sors pas du champ tant que celui-ci n'est pas correctement rempli sauf pour les ComboList qui même bien remplis, impossible de sortir.
    Tous mes contrôles sur Change() se lancent après MAJ de l'initialize() et champ par champ sur tous les champs TextBox mais pas les Combo.
    On m'a jeté un sort .....

    Je continue mes tests et reviens vers le forum.
    Noël approche et ici à Nouméa on fête l'évènement 10h avant la Métropole.
    Bon réveillon
    Cdt

  20. #20
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour Theze,

    Je reprends le fil de la discussion.
    J'ai fait le test en positionnant l'Initialize() de mon UserForm en commentaire ==> je confirme qu'il n'y a pas de changement et que certains contrôles à la saisie ne s'exécutent toujours pas !

    Après quelques tests, il n'y aurait que l'évènement Change() qui ne réponde pas.
    L'Exit(), le KeyPress() et le Click() fonctionnent.
    Ça peut être une piste ?

    Cordialement

Discussions similaires

  1. Ecouteur sur JButton qui ne fonctionne pas
    Par Morgan7469 dans le forum Interfaces Graphiques en Java
    Réponses: 22
    Dernier message: 27/12/2011, 09h30
  2. Un contrôle de formulaire qui ne fonctionne pas
    Par renaud26 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 11/01/2011, 02h20
  3. float sur div qui ne fonctionne pas
    Par stephane543 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 13/03/2010, 21h26
  4. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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