Rechercher dans ce blog

Nombre total de pages vues (en milliers)

LISTE DEROULANTE, Bouton OPTION(s), Case à COCHER

Pour faire suite au chapitre "Créer son formulaire", nous allons y ajouter des éléments supplémentaires afin de l'agrémenter en saisie.

Pour ce faire nous avons plusieurs possibilités :
1) Liste déroulante 
2) Cases à cocher (checkbox)
3) Bouton à cocher (optionbutton)
4) Zone de liste (explications et descriptif à venir)
5) Insérer une image (explications et descriptif à venir)

1) Liste déroulante : 

Tout d'abord accédez VbaProject (Alt + f11)

Insérez un nouveau Userform (ou ouvrez un existant) et ajoutez  "Une zone de liste modifiable" (Combobox1) :





Pour alimenter cette  liste déroulante voici plusieurs possibilités :

a) Méthode "Array" :
 
Sélectionnez Userform, Double-cliquez et ajoutez le code suivant :

Private Sub Userform_Initialize()
Combobox1.columnCount = 1  'Une colonne
Combobox1.List() = Array ("", "UN", "DEUX", "TROIS", "QUATRE", "CINQ") '1ère ligne vide et texte à suivre
End Sub

Pour visualiser votre liste déroulante dans l'userform, dans l'environnement VbaProject sélectionnez l'Userform et appuyez sur la touche F5 du clavier.

b) Méthode "Additem" :

Sélectionnez Userform, Double-cliquez et ajoutez le code suivant :


Private Sub Userform_initialize
    With Combobox1
      .AddItem ""
      .AddItem "UN"
     .AddItem "DEUX"
     .AddItem "TROIS"
     .AddItem "QUATRE"
     .AddItem "CINQ"
  End With
End Sub

Pour visualiser votre liste déroulante dans l'userform, dans l'environnement VbaProject sélectionnez l'Userform et appuyez sur la touche F5 du clavier.

C'est deux méthodes peuvent devenir fastidieuses si votre liste déroulante est très longue. Donc voici la méthode que je privilégie:

c) Liste déroulante issue d'une feuille de votre fichier :

Tout d'abord il faut créer un liste via le Gestionnaire de Noms  (Onglet Formules + Gestionnaire de noms).
Dans le Gestionnaire de noms cliquez sur Nouveau.
Donnez lui un nom (Ex. LISTE)
Ciblez "Fait référence à :"  à une plage de cellules d'une feuille contenant les noms à suivre.

Exemple :

 Accédez maintenant au VbaProject (Alt + f11)
 Sélectionnez Userform, Double-cliquez et ajoutez le code suivant :
Private Sub UserForm_Initialize()
ComboBox1.RowSource = ("LISTE")  'ComboBox1.RowSource = ("NomdelaListe") 
End Sub 
Pour visualiser votre liste déroulane dans l'userform, dans l'environnement VbaProject sélectionnez l'Userform et appuyez sur la touche F5 du clavier.   
Dès lors que votre Userform est ouvert, vous n'êtes pas dans l'obligation de faire défiler toute la liste déroulante pour accéder au nom à choisir.
Il vous suffit de tapez la première lettre du mot pour accéder au nom (Ex. dans notre cas  H pour HUIT)

c) Liste déroulante sans doublon issue d'une feuille de votre fichier :

Tout d'abord il faut créer une liste dans une feuille  et ensuite insérer le code suivant :

Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To Sheets("Nom de la feuille source").Range("A65536").End(xlUp).Row
ComboBox1 = Sheets("Nom de la feuille source").Range("A" & i)
If ComboBox1.ListIndex = - 1 Then ComboBox1.AddItem Sheets("Nom de la feuille source").Range("A" & i)
Next i
End Sub  

PS : Changer dans le code  Nom de la feuille source par le nom de votre feuille.

La liste déroulante apparaîtra dans votre formulaire sans les doublons.

Pour visualiser votre liste déroulante dans l'userform, dans l'environnement VbaProject sélectionnez l'Userform et appuyez sur la touche F5 du clavier.


d) Liste déroulante, obligation de choix

Si vous souhaitez obliger l'utilisateur à utiliser uniquement la liste déroulante afin qu'il ne puisse pas ajouter du texte, suivez l'instruction suivante :



  
e) Liste déroulante triée par ordre alphabétique.

  Pour trier la liste déroulante (items) par ordre alphabétique


   1) Ajouter le code suivant dans un module standard :

       Function ListSort(liSte)
        '  Code pour trier le tableau de la liste dans l'ordre croissant
       Dim First As Integer, Last As Integer
       Dim I As Integer, J As Integer
       Dim Temp
       First = LBound(liSte)
       Last = UBound(liSte)
       For I = First To Last - 1
       For J = I + 1 To Last
       If liSte(I, 0) > liSte(J, 0) Then
        Temp = liSte(J, 0)
         liste(J, 0) = liSte(I, 0)
         liste(I, 0) = Temp
       End If
       Next J
       Next I
       ListSort = liSte
       End Function


     2)  Ajouter dans Private Sub UserForm_Initialize() au niveau de la programmation de la
           combobox1 le code suivant :
           Me.ComboBox1.List = ListSort(Me.ComboBox1.List)

          Ce qui donne :

           ......With Me.ComboBox1
          For J = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row
          .AddItem Ws.Range("A" & J)
          Next J
          Me.ComboBox1.List = ListSort(Me.ComboBox1.List)
          End With


    3) Ajouter dans votre formulaire une deuxième combobox (Combobox2)
        et dans Private Sub UserForm_Initialize() ajouter le programme suivant :

       With Me.ComboBox2
       For J = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row
       .AddItem Ws.Range("A" & J)
       Next J
       End With


   4) Modifier le programme "Change" de la combobox1 pour lire :

      Private Sub ComboBox1_Change()
      ComboBox2 = ComboBox1
      End Sub


   5) Ajouter le programme "Change" de la combobox2  :

     Private Sub ComboBox2_Change()
     Dim Ligne As Long
     Dim I As Integer
      If Me.ComboBox2.ListIndex = -1 Then Exit Sub
     Ligne = Me.ComboBox2.ListIndex + 1
     For I = 1 To 3
     Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
     Next I
     End Sub


Maintenant la combobox1 est triée par ordre alphabétique, et dès que vous sélectionnez un nom dans cette liste triée, la Combobox2 s'alimente en fonction de ce choix.
Le choix peut aussi se faire par la combobox2 non triée.

"Alambiqué" peut-être.... mais ça fonctionne. S'il y a un lecteur qui a une solution plus efficace je suis preneur et je me ferai un plaisir de le mentionner sur ce blog.


Ci-joint fichier pour exemple




 2) Case à cocher ou Checkbox

Accédez VbaProject (Alt + f11)
Insérez un nouveau Userform (ou ouvrez un existant) et ajoutez  "Une case à cocher" (Checkbox1) :


Si la Checkbox1 est cochée/décochée la valeur de la cellule A1 correspondante sera modifiée avec l'évènement click.

Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then 'Si coché ...
       Range("A1") = "Coché"
    Else 'Si non coché ....

       Range("A1") = "Non coché"
    End If
End Sub


Si la Checkbox1 est cochée/décochée la valeur de la textbox1 correspondante sera modifiée avec l'évènement click.

Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then 'Si coché ...
       Textbox1.text = "123"
    Else 'Si non coché ....

       Textbox1.text = "" 'Vide
    End If
End Sub 


Si la Checkbox1 est cochée/décochée la valeur de la label1 (intitulé) correspondante sera modifiée avec l'évènement click.

  Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then
  'Si coché le texte "bolo bolo" apparaît dans le label.

       Label1.Caption = "bolo bolo"
    Else
'Si non coché ....

       Label1.Caption = ""    'Vide
    End If
End Sub


3) Le bouton à cocher (OptionButton)

Contrairement aux cases à cocher, on ne peut choisir qu'un seul bouton d'option par "groupe".  Pour créer un groupe, il faut insérez d'abord un cadre (Frame) puis les boutons d'option :


 Insérez ensuite le nombre de bouton à cocher souhaité, donnez leur le nom que vous souhaitez.




Ajoutez un CommandButton et donnez lui un nom dans Caption
Exemple "Validation"

Double-cliquez sur ce bouton et mettez-y le code suivant

Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In Frame1.Controls 'Pour tous les  contrôles du Fram1
If ctrl.Value = True Then 'Si une valeur contrôlée est vrai
MsgBox ctrl.Caption 'Apparition d'une MsgBox avec la valeur "Vrai", donc si l'OptionButtun 1 ("OUI") est cochée soit "Vrai", c'est le mot "OUI" qui apparaîtra dans la MsgBox
End If
Next
End Sub


De même, vous pouvez insérer cette valeur (Caption) dans une cellule.
Exemple, ranger en A1
Supprimez dans le code  MsgBox ctrl.Caption  et remplacez par Range("a1") = ctrl.Caption

Vous pouvez ajouter autant d'OptionButton, ou/et de Frame que vous souhaitez.

Exemple le code suivant correspond à 2 Frame et 4 OptionButton (deux dans chaque Frame)
La valeur du frame1 va être insérer en A1, et celle de la Frame2 en B1

Private Sub CommandButton1_Click()
Dim ctrl As Control
 

For Each ctrl In Frame1.Controls
If ctrl.Value = True Then
Range("A1") = ctrl.Caption
End If
Next
For Each ctrl In Frame2.Controls
If ctrl.Value = True Then
Range("B1") = ctrl.Caption
End If
Next
End Sub





 

7 commentaires :

  1. super idée je suis preneur pour autres idées .

    RépondreSupprimer
  2. Ok pas mal du tout.


    comment faire pour récupérer des infos situées sur d'autres feuilles par rapport à une valeur d'une cellule dans userforme ?

    RépondreSupprimer
  3. Bonjour,
    Un grand merci pour ces tutos qui mon fait progresser et bien avancer ma base de donnée.
    Petites question technique svp:
    Je veux utiliser des checkbox. 8 cases qui correspondent à des types d'utilisation (affectation) d'un produit. je veux les faire apparaitre dans une cellule unique, jusque là pas de problème, il peut y avoir plusieurs utilisations à envoyer dans la cellule. J'ai réussi en utilisant les conditions If :

    WsA.Cells(Ligne, 4) = ""
    If Me.CheckBox1.Value = True Then
    WsA.Cells(Ligne, 4) = (WsA.Cells(Ligne, 4)) & "TU...autre ; "
    End If
    If Me.CheckBox2.Value = True Then
    WsA.Cells(Ligne, 4) = (WsA.Cells(Ligne, 4)) & "TU5J4 ; "
    End If
    If Me.CheckBox3.Value = True Then
    WsA.Cells(Ligne, 4) = (WsA.Cells(Ligne, 4)) & "TU5JP4 ; "
    End If '....

    Mais j'aurais préférer pouvoir renseigner ma cellule sans le point virgule et l'espace en mettant la valeur par retour à la ligne par exemple ?
    A1
    TU...autre
    TU5JP4
    A2
    TU...autre
    TU5J4
    TU5JP4
    A3
    TU5JP4

    Ensuite dans un autre userform, j'ai besoin de revenir chercher ces valeurs et d'activer les checkbox tous FALSE en fonctions ce ces valeurs ?

    Merci pour votre aide

    RépondreSupprimer
    Réponses
    1. Bonjour
      Pour enlever le point virgule, il suffit tout simplement de ne pas le mettre dans le code.
      Changer WsA.Cells(Ligne, 4) = (WsA.Cells(Ligne, 4)) & "TU...autre ; "
      par WsA.Cells(Ligne, 4) = (WsA.Cells(Ligne, 4)) & "TU...autre"
      et pour le reste du code c'est identique.

      et pour activer les CheckBox en fonction des valeurs de la cellule voici le code

      If WsA.Cells(Ligne, 4) = "TU5JP4" Then
      Me.CheckBox3.Value = True
      Else
      Me.CheckBox3.Value = False
      End If
      Et ainsi de suite.....

      Supprimer
  4. Bonjour !! Merci beaucoup pour ce que vous faites :) J'ai fait deux listes déroulantes en cascade et j'ai 10 textbox. Je souhaiterais que la Textbox1, la 2 et la 3 s'affichent dès qu'on sélectionne quelqu'un dans la liste. ça correspondra à son identité ; à côté je mettrai une commande "modifier", êtes vous sûr de vouloir modifier etc. Auriez-vous une idée sur la démarche à suivre ? :)

    Puis les autres textbox serviront à saisir des chiffres donc c'est bien qu'elles soient nettoyées comme le propose votre code :)
    Tout le reste c'est ok grâce à votre super pédagogie !! :D Mercciii !!!

    RépondreSupprimer
    Réponses
    1. Bonjour,
      Vous pouvez à votre guise faire apparaître ou pas les TextBox
      Exemple pour faire apparaître les TextBox 1, 2 et 3
      Code :
      For I = 1 To 3 'on lance une boucle de valeur mini 1 et maxi 3
      Me.Controls("TextBox" & I).Visible = True 'affiche les les TextBox
      Next I

      et dans le cas ou vous ne souhaitez pas afficher les TextBox suivantes exemple de 4 à 10
      For I = 4 To 10 'on lance une boucle de valeur mini 4 et maxi 10
      Me.Controls("TextBox" & I).Visible = False 'affiche les données dans les textbox
      Next I

      Supprimer

Pour vous aider à publier votre commentaire, voici la marche à suivre :
1) Ecrivez votre texte dans le formulaire de saisie ci-dessus
2) Si vous avez un compte, vous pouvez vous identifier dans la liste déroulante Commentaire
Sinon, vous pouvez saisir votre nom ou pseudo par Nom/URL
3) Vous pouvez, en cliquant sur le lien S'abonner par e-mail, être assuré d'être avisé en cas d'une réponse
4) Cliquer sur Publier enfin.

Le message sera publié après modération.
Merci