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
super idée je suis preneur pour autres idées .
RépondreSupprimerOk pas mal du tout.
RépondreSupprimercomment faire pour récupérer des infos situées sur d'autres feuilles par rapport à une valeur d'une cellule dans userforme ?
Merci!
RépondreSupprimerBonjour,
RépondreSupprimerUn 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
Bonjour
SupprimerPour 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.....
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 ? :)
RépondreSupprimerPuis 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 !!!
Bonjour,
SupprimerVous 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