Je reviens avec un nouveau problème. J'ai choisi d'alimenter une combobox avec 3 colonnes.
Qui me facilite de compléter 2 textboxs.
Je voudrais tout en saisissant des caractères que la liste se filtre au fur et à mesure.
En effet, lorsque la liste est longue, ça devient pénible d'aller chercher la ligne souhaitée.
Si ce n'est pas possible ainsi (3 colonnes) auriez-vous une autre proposition assez souple à adapter sur mon véritable fichier.
re
et bien voila le complet
si c'est pas le bon index de colonne que tu veux dans les textbox tu les changes
mais n'oublie pas les tableaux sont en base 1 alors qu'une combo est en base 0
donc si tu veux la colonne 1 c'est 0 si tu veux la 2 c'est 1 etc.....
VB:
Option Explicit
Option Compare Text
Dim Tb(), tbc()
Private Sub ComboBox1_Click()
Dim i&
With ComboBox1
If .ListCount = 1 Then i = 0 Else i = .ListIndex ' solution du probleme listindex"-1"si une seule ligne
Me.TextBox1.Value = .List(i, 1)
Me.TextBox2.Value = .List(i, 2)
End With
End Sub
Private Sub ComboBox1_DropButtonClick(): ComboBox1.List = Tb: End Sub 'si tu n'a rien qui ressort du filtre la liste complete reste accessible par le...
Bonjour le forum Bonne fête de fin d'année J'aimerais savoir était possible d'afficher les noms des enfants dans la combo NomEnfant Svp une famille de 3 enfants par exemple comment en appellant le nom de cette famille afficher les noms de leurs enfants Ex. alphonse a 3 enfants en affichant...
bonsoir @cathodique, @Dranreb
pour répondre a ta question
pourquoi mes données sont sur une seule colonne dans la combo lorsque je n'ai qu'une ligne
et bien la réponse est simple
quand tu dimensionne un tableau 2 dim et que tu l'alimente et que tu te retrouve avec une seule ligne sur X colonne vba l’interprète comme un array
et comme ton .list contient la transposition ben voila tu a un tableau 2 dim mais x lignes et 1 colonne
donc quand c'est comme ça tu fait
je me suis permis de simplifier la chose
je compil 2 tableaux
un à 2 dim =liste complète
l'autre un array des lignes(colonne jointes)(pour les test après ça va plus vite
j'ai simplifié aussi la compil ton truc me faisait dormir debout
adapte le nom de ta feuille
j'attire donc ton attention sur bascule le .column ou .list
VB:
Private Sub ComboBox1_Change()
Dim t(), ok As Boolean, ligne, c, a&
With ComboBox1
For ligne = 1 To UBound(tbC)
If tbC(ligne) Like "*" & .Value & "*" Then
a = a + 1: ReDim Preserve t(1 To 4, 1 To a): For c = 1 To 4: t(c, a) = tb(ligne, c): Next
End If
Next ligne
If a>0 Then
If UBound(t, 2) = 1 Then .Column = t Else .List = Application.Transpose(t)
.DropDown
Else: .Clear
End If
End With
End Sub
Private Sub UserForm_Activate()
tb = Feuil1.[B2:e2].Resize([B2].CurrentRegion.Rows.Count - 1).Value
ReDim tbC(1 To UBound(tb))
With ComboBox1: .List = tb: .ColumnCount = 4: End With
For i = 1 To UBound(tb): tbC(i) = Join(Application.Index(tb, i, 0)): Next
End Sub
Je vous est moi même déjà indiqué en lien une discussion où vous pouviez récupérer un classeur équipé.
Un autre poste plus loin de la même discussion où il avait évolué :
Bonjour le forum Bonne fête de fin d'année J'aimerais savoir était possible d'afficher les noms des enfants dans la combo NomEnfant Svp une famille de 3 enfants par exemple comment en appellant le nom de cette famille afficher les noms de leurs enfants Ex. alphonse a 3 enfants en affichant...
Bonjour le forum Bonne fête de fin d'année J'aimerais savoir était possible d'afficher les noms des enfants dans la combo NomEnfant Svp une famille de 3 enfants par exemple comment en appellant le nom de cette famille afficher les noms de leurs enfants Ex. alphonse a 3 enfants en affichant...
re
c'est normal t n'est pas global
et il y a un autre problème dont a fait l'objet une discussion très récemment
la récupération de l'index donne toujours - 1 dans l'event click
il faudra retrouver cette discussion
pour la peine voici le même code mais en réglant le problème du repaint de la combo
en effet quand tu tape la liste se reduit ou diminue et si tu tombe sur un filtre négatif une partie de la liste reste visuelle sauf qu'elle est éphémère et elle n'est pas cliquable
donc je règle se problème avec un coupe circuit "avec enabled(false/true+re setfocus )
je vais réfléchir a te texte box en tout cas ce n'est pas t qu'il reçoivent
voila le code avec repaint combo
VB:
Dim Tb(), tbc()
Private Sub ComboBox1_Click()
'ici a corriger
'Me.TextBox1.Value = t(1, 2)
'Me.TextBox2.Value = t(1, 3)
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub ComboBox1_Change()
Dim t(), ligne, c, a&
With ComboBox1
For ligne = 1 To UBound(tbc)
If tbc(ligne) Like "*" & .Value & "*" Then
a = a + 1: ReDim Preserve t(1 To 4, 1 To a): For c = 1 To 4: t(c, a) = Tb(ligne, c): Next ' on redim les trouvé transposé
End If
Next ligne
If a > 0 Then
If UBound(t, 2) = 1 Then ' si il n'a qu'une seul ligne '
.Column = t
Else 'si le tableau résultant du filtrage a plus d'une ligne
.List = Application.Transpose(t)
End If
.DropDown 'si plus de zero ligne on dropdown
Else
'ici c'est un peu particulier c'est juste pour le probleme de repaint des combo quand on force le dropdown
' le repaint de l'userform n'etant pas operant vu que les combobox comme les listbox et frame ont leur propre handle
.Enabled = False 'on la rend inutilisable ce qui a pour effet de la refermer
.Enabled = True ' on la réactive bien sur
.SetFocus ' et on lui redonne le focus pour continuer a taper
.Clear ' si tu ne veux pas la liste complete quand aucune correspondance (filtre négatif)
'.List = tb' si tu veux la liste complete en cas de filtre negatif pour choisir toi meme
End If
End With
' autrement dit si il y a quelque chose --> dropdown sinon pas dropdown
End Sub
Private Sub UserForm_Activate()
Tb = Feuil1.[B2:e2].Resize([B2].CurrentRegion.Rows.Count - 1).Value't = la plage.value
ReDim tbc(1 To UBound(Tb)) 'on redim un array (1dim)du meme nombre de ligne
With ComboBox1: .List = Tb: .ColumnCount = 4: End With 'on met tb dans la combo(liste complete)
For i = 1 To UBound(Tb): tbc(i) = Join(Application.Index(Tb, i, 0), "|"): Next 'a chaque item de notre array on met la ligne(i) complete de tb
End Sub
re
c'est normal t n'est pas global
et il y a un autre problème dont a fait l'objet une discussion très récemment
la récupération de l'index donne toujours - 1 dans l'event click
il faudra retrouver cette discussion
pour la peine voici le même code mais en réglant le problème du repaint de la combo
en effet quand tu tape la liste se reduit ou diminue et si tu tombe sur un filtre négatif une partie de la liste reste visuelle sauf qu'elle est éphémère et elle n'est pas cliquable
donc je règle se problème avec un coupe circuit "avec enabled(false/true+re setfocus )
je vais réfléchir a te texte box en tout cas ce n'est pas t qu'il reçoivent
voila le code avec repaint combo
VB:
Dim Tb(), tbc()
Private Sub ComboBox1_Click()
'ici a corriger
'Me.TextBox1.Value = t(1, 2)
'Me.TextBox2.Value = t(1, 3)
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub ComboBox1_Change()
Dim t(), ligne, c, a&
With ComboBox1
For ligne = 1 To UBound(tbc)
If tbc(ligne) Like "*" & .Value & "*" Then
a = a + 1: ReDim Preserve t(1 To 4, 1 To a): For c = 1 To 4: t(c, a) = Tb(ligne, c): Next ' on redim les trouvé transposé
End If
Next ligne
If a > 0 Then
If UBound(t, 2) = 1 Then ' si il n'a qu'une seul ligne '
.Column = t
Else 'si le tableau résultant du filtrage a plus d'une ligne
.List = Application.Transpose(t)
End If
.DropDown 'si plus de zero ligne on dropdown
Else
'ici c'est un peu particulier c'est juste pour le probleme de repaint des combo quand on force le dropdown
' le repaint de l'userform n'etant pas operant vu que les combobox comme les listbox et frame ont leur propre handle
.Enabled = False 'on la rend inutilisable ce qui a pour effet de la refermer
.Enabled = True ' on la réactive bien sur
.SetFocus ' et on lui redonne le focus pour continuer a taper
.Clear ' si tu ne veux pas la liste complete quand aucune correspondance (filtre négatif)
'.List = tb' si tu veux la liste complete en cas de filtre negatif pour choisir toi meme
End If
End With
' autrement dit si il y a quelque chose --> dropdown sinon pas dropdown
End Sub
Private Sub UserForm_Activate()
Tb = Feuil1.[B2:e2].Resize([B2].CurrentRegion.Rows.Count - 1).Value't = la plage.value
ReDim tbc(1 To UBound(Tb)) 'on redim un array (1dim)du meme nombre de ligne
With ComboBox1: .List = Tb: .ColumnCount = 4: End With 'on met tb dans la combo(liste complete)
For i = 1 To UBound(Tb): tbc(i) = Join(Application.Index(Tb, i, 0), "|"): Next 'a chaque item de notre array on met la ligne(i) complete de tb
End Sub
Merci beaucoup. Il manquait Option Compare Text. En effet, lorsque je tapais en minuscule (ex: nou, il n'y a plus de ligne d'affichée alors qu'il y a cette ligne "Nourriture animale, Litière". Là, c'est réglé.
re
et bien voila le complet
si c'est pas le bon index de colonne que tu veux dans les textbox tu les changes
mais n'oublie pas les tableaux sont en base 1 alors qu'une combo est en base 0
donc si tu veux la colonne 1 c'est 0 si tu veux la 2 c'est 1 etc.....
VB:
Option Explicit
Option Compare Text
Dim Tb(), tbc()
Private Sub ComboBox1_Click()
Dim i&
With ComboBox1
If .ListCount = 1 Then i = 0 Else i = .ListIndex ' solution du probleme listindex"-1"si une seule ligne
Me.TextBox1.Value = .List(i, 1)
Me.TextBox2.Value = .List(i, 2)
End With
End Sub
Private Sub ComboBox1_DropButtonClick(): ComboBox1.List = Tb: End Sub 'si tu n'a rien qui ressort du filtre la liste complete reste accessible par le dropbutton
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub ComboBox1_Change()
Dim t(), ligne, c, a&
With ComboBox1
For ligne = 1 To UBound(tbc)
If tbc(ligne) Like "*" & .Value & "*" Then
a = a + 1: ReDim Preserve t(1 To 4, 1 To a): For c = 1 To 4: t(c, a) = Tb(ligne, c): Next ' on redim les trouvé transposé
End If
Next ligne
If a > 0 Then
If UBound(t, 2) = 1 Then ' si il n'a qu'une seul ligne '
.Column = t
Else 'si le tableau résultant du filtrage a plus d'une ligne
.List = Application.Transpose(t)
End If
.DropDown 'si plus de zero ligne on dropdown
Else
'ici c'est un peu particulier c'est juste pour le probleme de repaint des combo quand on force le dropdown
' le repaint de l'userform n'etant pas operant vu que les combobox comme les listbox et frame ont leur propre handle
.Enabled = False 'on la rend inutilisable ce qui a pour effet de la refermer
.Enabled = True ' on la réactive bien sur
.SetFocus ' et on lui redonne le focus pour continuer a taper
.Clear ' si tu ne veux pas la liste complete quand aucune correspondance (filtre négatif)
'.List = tb' si tu veux la liste complete en cas de filtre negatif pour choisir toi meme
End If
End With
' autrement dit si il y a quelque chose --> dropdown sinon pas dropdown
End Sub
Private Sub UserForm_Activate()
Dim i&
Tb = Feuil1.[B2:e2].Resize([B2].CurrentRegion.Rows.Count - 1).Value 'b = la plage.value
ReDim tbc(1 To UBound(Tb)) 'on redim un array (1dim)du meme nombre de ligne
With ComboBox1: .List = Tb: .ColumnCount = 4: End With 'on met tb dans la combo(liste complete)
For i = 1 To UBound(Tb): tbc(i) = Join(Application.Index(Tb, i, 0), "|"): Next 'a chaque item de notre array on met la ligne(i) complete de tb
End Sub
re
et bien voila le complet
si c'est pas le bon index de colonne que tu veux dans les textbox tu les changes
mais n'oublie pas les tableaux sont en base 1 alors qu'une combo est en base 0
donc si tu veux la colonne 1 c'est 0 si tu veux la 2 c'est 1 etc.....
VB:
Option Explicit
Option Compare Text
Dim Tb(), tbc()
Private Sub ComboBox1_Click()
Dim i&
With ComboBox1
If .ListCount = 1 Then i = 0 Else i = .ListIndex ' solution du probleme listindex"-1"si une seule ligne
Me.TextBox1.Value = .List(i, 1)
Me.TextBox2.Value = .List(i, 2)
End With
End Sub
Private Sub ComboBox1_DropButtonClick(): ComboBox1.List = Tb: End Sub 'si tu n'a rien qui ressort du filtre la liste complete reste accessible par le dropbutton
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub ComboBox1_Change()
Dim t(), ligne, c, a&
With ComboBox1
For ligne = 1 To UBound(tbc)
If tbc(ligne) Like "*" & .Value & "*" Then
a = a + 1: ReDim Preserve t(1 To 4, 1 To a): For c = 1 To 4: t(c, a) = Tb(ligne, c): Next ' on redim les trouvé transposé
End If
Next ligne
If a > 0 Then
If UBound(t, 2) = 1 Then ' si il n'a qu'une seul ligne '
.Column = t
Else 'si le tableau résultant du filtrage a plus d'une ligne
.List = Application.Transpose(t)
End If
.DropDown 'si plus de zero ligne on dropdown
Else
'ici c'est un peu particulier c'est juste pour le probleme de repaint des combo quand on force le dropdown
' le repaint de l'userform n'etant pas operant vu que les combobox comme les listbox et frame ont leur propre handle
.Enabled = False 'on la rend inutilisable ce qui a pour effet de la refermer
.Enabled = True ' on la réactive bien sur
.SetFocus ' et on lui redonne le focus pour continuer a taper
.Clear ' si tu ne veux pas la liste complete quand aucune correspondance (filtre négatif)
'.List = tb' si tu veux la liste complete en cas de filtre negatif pour choisir toi meme
End If
End With
' autrement dit si il y a quelque chose --> dropdown sinon pas dropdown
End Sub
Private Sub UserForm_Activate()
Dim i&
Tb = Feuil1.[B2:e2].Resize([B2].CurrentRegion.Rows.Count - 1).Value 'b = la plage.value
ReDim tbc(1 To UBound(Tb)) 'on redim un array (1dim)du meme nombre de ligne
With ComboBox1: .List = Tb: .ColumnCount = 4: End With 'on met tb dans la combo(liste complete)
For i = 1 To UBound(Tb): tbc(i) = Join(Application.Index(Tb, i, 0), "|"): Next 'a chaque item de notre array on met la ligne(i) complete de tb
End Sub