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