Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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.

 

Dranreb

XLDnaute Barbatruc
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.
 

Emmanuel B.

XLDnaute Nouveau


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

  • comboBoxSearch.xlsm
    29.6 KB · Affichages: 15

Dranreb

XLDnaute Barbatruc
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.
 

Emmanuel B.

XLDnaute Nouveau


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

Ta proposition sera la bienvenue
 

patricktoulon

XLDnaute Barbatruc
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
 

patricktoulon

XLDnaute Barbatruc
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
 

Emmanuel B.

XLDnaute Nouveau

Bonsoir Patricktoulon
Merci beaucoup pour le code. ça marche.
ça va m'éviter plusieur "copier coller".
 

Emmanuel B.

XLDnaute Nouveau


Cool
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…