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.

:D
 

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

  • 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
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:p
 

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
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".
 

Emmanuel B.

XLDnaute Nouveau
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:D
 

Discussions similaires

Statistiques des forums

Discussions
312 115
Messages
2 085 447
Membres
102 889
dernier inscrit
monsef JABBOUR