XL 2016 Créer une classe pour afficher les résultats de la recherche dans plusieurs combobox

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Emmanuel B.

XLDnaute Nouveau
Salut à tous,
J'ai un formulaire avec 04 comboboxes. J'ai trouvé un code en ligne qui me permet de rechercher des éléments dans une liste déroulante, d'utiliser les touches fléchées et la flèche déroulante du combobox. Je souhaite créer une classe qui ferait la même chose pour tous les combobox, sans avoir à copier le même code 04 fois.

J'ai joint le fichier.

Merci d'avance.

😀
 
Bonjour.
j'ai un complément qui permet d'utiliser des ComboBox pour rechercher à certaines colonnes une ligne d'un tableau portant une combinaison des valeurs y étant spécifiées si vous voulez.
Joignez un petit fichier, là, contrairement à ce que vous dites, vous ne l'avez pas fait.
 
Bonjour.
j'ai un complément qui permet d'utiliser des ComboBox pour rechercher à certaines colonnes une ligne d'un tableau portant une combinaison des valeurs y étant spécifiées si vous voulez.
Joignez un petit fichier, là, contrairement à ce que vous dites, vous ne l'avez pas fait.


Ohh désolé. Ici le fichier joint et le code:

Private IsArrow As Boolean
Private Sub ComboBox1_Change()
Dim i As Long
With Me.ComboBox1
If Not IsArrow Then .List = Range("Items").Value
If .ListIndex = -1 And Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, 1) = 0 Then .RemoveItem i
Next i
.DropDown
End If
End With
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = KeyCode = vbKeyUp Or KeyCode = vbKeyDown
If KeyCode = vbKeyReturn Then Me.ComboBox1.List = Range("Items").Value
End Sub

Private Sub UserForm_Initialize()
With Me.ComboBox1
.RowSource = ""
.List = Range("Items").Value
End With
End Sub
 

Pièces jointes

Non, ce que je vous proposait n'a pas l'air de correspondre avec ce que vous voudriez: Il n'y aurait pas de liste prédéfinies pour les ComboBox : elle seraient établies dynamiquement d'après ce qui existerait dans un tableau et ce qui aurait déjà été tapé ou sélectionné dans les listes de certaines d'entre elles.
 
Non, ce que je vous proposait n'a pas l'air de correspondre avec ce que vous voudriez: Il n'y aurait pas de liste prédéfinies pour les ComboBox : elle seraient établies dynamiquement d'après ce qui existerait dans un tableau et ce qui aurait déjà été tapé ou sélectionné dans les listes de certaines d'entre elles.


Merci de répondre Dranreb. Je me suis peut être mal exprimé. Merci de recardrer.
Le code dans le formulaire fonctionne avec le combobox1. Je pourrais copier le code 04 fois pour chacun des combobox (puis qu'il y a 04 combobox: combobox1, combobox2, combobox3, combobox4), Mais je voudrais une solution dynamique parcequ'il y aura 15 combobox environ ayant pour source la même colonne du tableau "Items".

Merci d'avance
Non, ce que je vous proposait n'a pas l'air de correspondre avec ce que vous voudriez: Il n'y aurait pas de liste prédéfinies pour les ComboBox : elle seraient établies dynamiquement d'après ce qui existerait dans un tableau et ce qui aurait déjà été tapé ou sélectionné dans les listes de certaines d'entre elles.

Ta proposition sera la bienvenue😛
 
RE

bonjour
je te propose de classer tes 4 comboboxs dans l'userform et de te passer du module classe
le procédé reste identique un petit exemple avec 4 comboboxs
les événements deviennent Combo_KeyDown et Combo_Change()
et ils servent pour tes 4 comboboxs

tu n'a plus qu'a réadapter tes plage source des listes 😉

VB:
Public WithEvents combo As MSForms.ComboBox
Dim classe_interneUSF(1 To 4) As New UserForm1


Private IsArrow As Boolean
Private Sub Combo_Change()
Dim i As Long
With Me.Combo
If Not IsArrow Then .List = Range("A1:A10").Value
If .ListIndex = -1 And Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, 1) = 0 Then .RemoveItem i
Next i
.DropDown
End If
End With
End Sub

Private Sub Combo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = KeyCode = vbKeyUp Or KeyCode = vbKeyDown
If KeyCode = vbKeyReturn Then Me.combo.List = Range("A1:A10").Value
End Sub

Private Sub UserForm_Activate()
Set classe_interneUSF(1).combo = ComboBox1
Set classe_interneUSF(2).combo = ComboBox2
Set classe_interneUSF(3).combo = ComboBox3
Set classe_interneUSF(4).combo = ComboBox4

End Sub

Private Sub UserForm_Initialize()
Me.ComboBox1.List = Range("A1:A10").Value
Me.ComboBox2.List = Range("B1:B10").Value
Me.ComboBox3.List = Range("C1:C10").Value
Me.ComboBox4.List = Range("D1:D10").Value
End Sub
 
re
quelques petites corrections
chacunes leurs ranges 😉
VB:
Public WithEvents combo As MSForms.ComboBox
Dim classe_interneUSF(1 To 4) As New UserForm1
Dim Rng(1 To 4)
Private IsArrow As Boolean
Private Sub Combo_Change()
Dim i As Long
With Me.combo
If Not IsArrow Then .List = Rng(Val(combo.Tag))
If .ListIndex = -1 And Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, 1) = 0 Then .RemoveItem i
Next i
.DropDown
End If
End With
End Sub

Private Sub Combo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = KeyCode = vbKeyUp Or KeyCode = vbKeyDown
If KeyCode = vbKeyReturn Then Me.combo.List = Rng(Val(combo.Tag))
End Sub

Private Sub UserForm_Activate()
Set classe_interneUSF(1).combo = ComboBox1
Set classe_interneUSF(2).combo = ComboBox2
Set classe_interneUSF(3).combo = ComboBox3
Set classe_interneUSF(4).combo = ComboBox4

End Sub

Private Sub UserForm_Initialize()
Rng(1) = Range("A1:A10").Value
Rng(2) = Range("B1:B10").Value
Rng(3) = Range("C1:C10").Value
Rng(4) = Range("D1:D10").Value
For i = 1 To 4
With Me.Controls("ComboBox" & i): .List = Rng(i): .Tag = i: End With
Next
End Sub
 
RE

bonjour
je te propose de classer tes 4 comboboxs dans l'userform et de te passer du module classe
le procédé reste identique un petit exemple avec 4 comboboxs
les événements deviennent Combo_KeyDown et Combo_Change()
et ils servent pour tes 4 comboboxs

tu n'a plus qu'a réadapter tes plage source des listes 😉

VB:
Public WithEvents combo As MSForms.ComboBox
Dim classe_interneUSF(1 To 4) As New UserForm1


Private IsArrow As Boolean
Private Sub Combo_Change()
Dim i As Long
With Me.Combo
If Not IsArrow Then .List = Range("A1:A10").Value
If .ListIndex = -1 And Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, 1) = 0 Then .RemoveItem i
Next i
.DropDown
End If
End With
End Sub

Private Sub Combo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = KeyCode = vbKeyUp Or KeyCode = vbKeyDown
If KeyCode = vbKeyReturn Then Me.combo.List = Range("A1:A10").Value
End Sub

Private Sub UserForm_Activate()
Set classe_interneUSF(1).combo = ComboBox1
Set classe_interneUSF(2).combo = ComboBox2
Set classe_interneUSF(3).combo = ComboBox3
Set classe_interneUSF(4).combo = ComboBox4

End Sub

Private Sub UserForm_Initialize()
Me.ComboBox1.List = Range("A1:A10").Value
Me.ComboBox2.List = Range("B1:B10").Value
Me.ComboBox3.List = Range("C1:C10").Value
Me.ComboBox4.List = Range("D1:D10").Value
End Sub

Bonsoir Patricktoulon
Merci beaucoup pour le code. ça marche.
ça va m'éviter plusieur "copier coller".
 
re
quelques petites corrections
chacunes leurs ranges 😉
VB:
Public WithEvents combo As MSForms.ComboBox
Dim classe_interneUSF(1 To 4) As New UserForm1
Dim Rng(1 To 4)
Private IsArrow As Boolean
Private Sub Combo_Change()
Dim i As Long
With Me.combo
If Not IsArrow Then .List = Rng(Val(combo.Tag))
If .ListIndex = -1 And Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, 1) = 0 Then .RemoveItem i
Next i
.DropDown
End If
End With
End Sub

Private Sub Combo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = KeyCode = vbKeyUp Or KeyCode = vbKeyDown
If KeyCode = vbKeyReturn Then Me.combo.List = Rng(Val(combo.Tag))
End Sub

Private Sub UserForm_Activate()
Set classe_interneUSF(1).combo = ComboBox1
Set classe_interneUSF(2).combo = ComboBox2
Set classe_interneUSF(3).combo = ComboBox3
Set classe_interneUSF(4).combo = ComboBox4

End Sub

Private Sub UserForm_Initialize()
Rng(1) = Range("A1:A10").Value
Rng(2) = Range("B1:B10").Value
Rng(3) = Range("C1:C10").Value
Rng(4) = Range("D1:D10").Value
For i = 1 To 4
With Me.Controls("ComboBox" & i): .List = Rng(i): .Tag = i: End With
Next
End Sub


Cool😀
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour