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 :

Affichage 2eme textbox après saisie 1ere textbox et passage focus [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 21
    Par défaut Affichage 2eme textbox après saisie 1ere textbox et passage focus
    Bonjour à tous et merci d'avance pour votre temps et votre aide

    Malgré mes recherches je n'ai pas trouvé de solution à mon problème. Peut-être s'agit-il d'un problème de conception.
    Dans un formulaire Excel j'ai 2 textbox (F_List_Nom et F_List_Discipline) et un bouton F_BUT_Enregistrer.
    A l'appel de mon formulaire je rend invisible la deuxième textbox(F_List_Discipline) ainsi que le bouton F_BUT_Enregistrer.
    J'aimerais qu'après la saisie de la première textbox je rende visible la deuxieme textbox et le bouton et que le focus passe directement sur cette deuxième textbox.
    Le code VBA semble donc relativement simple:

    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
    32
    33
    34
    35
    36
    37
    38
    Private Sub UserForm_Initialize()
        'Effacement champs
        Me.Controls.Item("F_List_Discipline").Visible = False
        Me.Controls.Item("F_List_Discipline").Enabled = False
        Me.Controls.Item("F_BUT_Enregistrer").Visible = False
        Me.Controls.Item("F_BUT_Enregistrer").Enabled = False
    End Sub
     
    Private Sub F_List_Nom_Change()
        'Effacement champs
        Me.Controls.Item("F_List_Discipline").Visible = False
        Me.Controls.Item("F_List_Discipline").Enabled = False
        Me.Controls.Item("F_BUT_Enregistrer").Visible = False
        Me.Controls.Item("F_BUT_Enregistrer").Enabled = False
    End Sub
     
    Private Sub F_List_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If Me.Controls.Item("F_List_Nom").Text <> "" Then
            Me.Controls.Item("F_List_Discipline").Visible = True
            Me.Controls.Item("F_List_Discipline").Enabled = True
            Me.Controls.Item("F_List_Discipline").SetFocus
        End If
    End Sub
     
    Private Sub F_List_Discipline_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        'Affichage zones saisie
        If Me.Controls.Item("F_List_Discipline").Text <> "" Then
            Me.Controls.Item("F_BUT_Enregistrer").Visible = True
            Me.Controls.Item("F_BUT_Enregistrer").Enabled = True
        End If
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click() ' Enregistre points saisis
        If Me.Controls.Item("F_List_Discipline").Text <> "" Then
            MsgBox ("Fiche Point enregistrée")
            Unload Me
        End If
    End Sub
    Nom : 2024-11-03 19_49_36-Microsoft Visual Basic pour Applications - test.xlsm - [test.xlsm - UF_Grill.png
Affichages : 113
Taille : 8,8 Ko
    Nom : 2024-11-03 19_52_40-test.xlsm - Excel.png
Affichages : 104
Taille : 4,0 Ko

    Hors à l'exécution, le focus boucle sur la 1ère textbox (F_List_Nom) et la 2ème textbox ainsi que le bouton reste invisibles.
    J'avoue ne rien comprendre

    Merci encore pour votre expérience

    Phil

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, tu utilises l'évènement _Change du textbox, mais à quel moment tu quittes le textbox ? A un moment il faut valider ton entrée, ce que tu ne fais pas, donc _Change tourne en boucle et tes contrôles restent invisibles.
    J'utilise _KeyDown pour détecter l'appui sur ENTER ou TAB, change si nécessaire.

    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
    32
    33
    34
    35
    36
    37
    38
    Private Sub UserForm_Initialize()
        Me.F_List_Discipline.Visible = False
        Me.F_BUT_Enregistrer.Visible = False
    End Sub
     
    Private Sub F_List_Nom_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        ' Si l'utilisateur appuie sur Entrée (13) ou Tab (9)
        If KeyCode = 13 Or KeyCode = 9 Then
            If Me.F_List_Nom.Text <> "" Then
                Me.F_List_Discipline.Visible = True
                Me.F_List_Discipline.SetFocus
                KeyCode = 0 ' Empêche un comportement supplémentaire après la touche
            Else
                MsgBox "Veuillez saisir une valeur dans le champ 'Nom' avant de continuer.", vbExclamation
            End If
        End If
    End Sub
     
    Private Sub F_List_Discipline_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        ' Si l'utilisateur appuie sur Entrée (13) ou Tab (9)
        If KeyCode = 13 Or KeyCode = 9 Then
            If Me.F_List_Discipline.Text <> "" Then
                Me.F_BUT_Enregistrer.Visible = True
                KeyCode = 0 ' Empêche un comportement supplémentaire après la touche
            Else
                MsgBox "Veuillez saisir une valeur dans le champ 'Discipline' avant de continuer.", vbExclamation
            End If
        End If
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()
        If Me.F_List_Nom.Text <> "" And Me.F_List_Discipline.Text <> "" Then
            MsgBox "Fiche Point enregistrée"
            Unload Me
        Else
            MsgBox "Veuillez remplir tous les champs avant d'enregistrer.", vbExclamation
        End If
    End Sub

  3. #3
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 516
    Par défaut
    Bonjour,
    Tout d'abords appelons les contrôles par leurs types respectifs, Vous nous parlez de zone de texte alors que l'image montre des zone de listes déroulantes.
    Puis nul besoin de passer par la collection de contrôle du formulaire, un simple F_List_Discipline.Visible fait l'affaire.
    Concernant vôtre demande vous pouvez tester si la valeur de vos zone de liste sont à remplies. Si oui alors on affiche les contrôles concernés.
    Nul besoin de mettre les propriétés visible et Enabled à False, si les contrôles ne sont pas visible aucune interaction ne sera possible.
    Donc cela donne :
    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
    Private Sub UserForm_Initialize()
        With F_List_Nom
            F_List_Discipline.Visible = (.Value > vbNullString)
            F_BUT_Enregistrer.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_List_Nom_Change()
        With F_List_Nom
            F_List_Discipline.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_List_Discipline_Change(ByVal Cancel As MSForms.ReturnBoolean)
        With F_List_Discipline
            F_BUT_Enregistrer.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()            ' Enregistre points saisis
        If F_List_Discipline.Text <> vbNullString Then
            MsgBox ("Fiche Point enregistrée")
            Unload Me
        End If
    End Sub
    Nous pouvons aussi tester que la valeur entrée dans la zone de liste fait bien partie de la liste des Items:
    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 UserForm_Initialize()
            F_List_Discipline.Visible = False
            F_BUT_Enregistrer.Visible = False
    End Sub
     
    Private Sub F_List_Nom_Change()
        With F_List_Nom
     
            F_List_Discipline.Visible = (.ListIndex > -1)
        End With
    End Sub
     
    Private Sub F_List_Discipline_Change(ByVal Cancel As MSForms.ReturnBoolean)
        With F_List_Discipline
            F_BUT_Enregistrer.Visible = (.ListIndex > -1)
        End With
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()            ' Enregistre points saisis
        If F_List_Discipline.ListIndex > -1 Then
            MsgBox ("Fiche Point enregistrée")
            Unload Me
        End If
    End Sub

    ps : Code tapé à la volée et non testé.

  4. #4
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 21
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Bonjour,
    Tout d'abords appelons les contrôles par leurs types respectifs, Vous nous parlez de zone de texte alors que l'image montre des zone de listes déroulantes.
    Puis nul besoin de passer par la collection de contrôle du formulaire, un simple F_List_Discipline.Visible fait l'affaire.
    Concernant vôtre demande vous pouvez tester si la valeur de vos zone de liste sont à remplies. Si oui alors on affiche les contrôles concernés.
    Nul besoin de mettre les propriétés visible et Enabled à False, si les contrôles ne sont pas visible aucune interaction ne sera possible.
    Donc cela donne :
    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
    Private Sub UserForm_Initialize()
        With F_List_Nom
            F_List_Discipline.Visible = (.Value > vbNullString)
            F_BUT_Enregistrer.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_List_Nom_Change()
        With F_List_Nom
            F_List_Discipline.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_List_Discipline_Change(ByVal Cancel As MSForms.ReturnBoolean)
        With F_List_Discipline
            F_BUT_Enregistrer.Visible = (.Value > vbNullString)
        End With
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()            ' Enregistre points saisis
        If F_List_Discipline.Text <> vbNullString Then
            MsgBox ("Fiche Point enregistrée")
            Unload Me
        End If
    End Sub
    Nous pouvons aussi tester que la valeur entrée dans la zone de liste fait bien partie de la liste des Items:
    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 UserForm_Initialize()
            F_List_Discipline.Visible = False
            F_BUT_Enregistrer.Visible = False
    End Sub
     
    Private Sub F_List_Nom_Change()
        With F_List_Nom
     
            F_List_Discipline.Visible = (.ListIndex > -1)
        End With
    End Sub
     
    Private Sub F_List_Discipline_Change(ByVal Cancel As MSForms.ReturnBoolean)
        With F_List_Discipline
            F_BUT_Enregistrer.Visible = (.ListIndex > -1)
        End With
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()            ' Enregistre points saisis
        If F_List_Discipline.ListIndex > -1 Then
            MsgBox ("Fiche Point enregistrée")
            Unload Me
        End If
    End Sub

    ps : Code tapé à la volée et non testé.
    Bonjour Valtrase,
    Merci à toi aussi d'avoir pris le temps de me répondre. J'ai utilisé le code de Franc qui a solutionné mon problème, ou plutôt corriger mes erreurs de logiques.
    Tu as raison je faisais référence à tes list-box et non des text-box (erreur d'attention).
    Je garde ton code très intéressant par rapport à l'utilisation de .ListIndex qui va me servir dans un autre module.
    Merci encore

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 21
    Par défaut
    Citation Envoyé par Franc Voir le message
    Salut, tu utilises l'évènement _Change du textbox, mais à quel moment tu quittes le textbox ? A un moment il faut valider ton entrée, ce que tu ne fais pas, donc _Change tourne en boucle et tes contrôles restent invisibles.
    J'utilise _KeyDown pour détecter l'appui sur ENTER ou TAB, change si nécessaire.

    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
    32
    33
    34
    35
    36
    37
    38
    Private Sub UserForm_Initialize()
        Me.F_List_Discipline.Visible = False
        Me.F_BUT_Enregistrer.Visible = False
    End Sub
     
    Private Sub F_List_Nom_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        ' Si l'utilisateur appuie sur Entrée (13) ou Tab (9)
        If KeyCode = 13 Or KeyCode = 9 Then
            If Me.F_List_Nom.Text <> "" Then
                Me.F_List_Discipline.Visible = True
                Me.F_List_Discipline.SetFocus
                KeyCode = 0 ' Empêche un comportement supplémentaire après la touche
            Else
                MsgBox "Veuillez saisir une valeur dans le champ 'Nom' avant de continuer.", vbExclamation
            End If
        End If
    End Sub
     
    Private Sub F_List_Discipline_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        ' Si l'utilisateur appuie sur Entrée (13) ou Tab (9)
        If KeyCode = 13 Or KeyCode = 9 Then
            If Me.F_List_Discipline.Text <> "" Then
                Me.F_BUT_Enregistrer.Visible = True
                KeyCode = 0 ' Empêche un comportement supplémentaire après la touche
            Else
                MsgBox "Veuillez saisir une valeur dans le champ 'Discipline' avant de continuer.", vbExclamation
            End If
        End If
    End Sub
     
    Private Sub F_BUT_Enregistrer_Click()
        If Me.F_List_Nom.Text <> "" And Me.F_List_Discipline.Text <> "" Then
            MsgBox "Fiche Point enregistrée"
            Unload Me
        Else
            MsgBox "Veuillez remplir tous les champs avant d'enregistrer.", vbExclamation
        End If
    End Sub
    Hello Franc,
    Tout d'abord merci pour tes efforts. Effectivement je pensais que l'évènement EXIT permettait de valider ma saisie. Ton code fonctionne à merveille.
    Vraiment merci ... je commençais à tourner en rond comme ma list-box

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

Discussions similaires

  1. Calendrier pour plusieurs textbox vba excel 2016 et affichage de l'heure
    Par chermoun dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/11/2017, 06h11
  2. [XL-2003] Remplissage automatique après saisie TextBox
    Par Artoche dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/05/2010, 16h19
  3. [AJAX] Lancer une 2eme fonction apres la reponse de la 1ere fonction
    Par lelapinrusse dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 03/05/2008, 18h36
  4. Focus sur textbox après saisie
    Par ogeiger dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2008, 16h02
  5. Remplacer un caractère après saisie dans TextBox
    Par melouille56 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/10/2007, 15h12

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