XL 2010 Filtrage combobox - Pourquoi?

cathodique

XLDnaute Barbatruc
Bonsoir:),

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.

En vous remerciant par avance.
 
Dernière édition:
Solution
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...

Dranreb

XLDnaute Barbatruc
J'ai retrouvé un fil assez récent où je joignis un classeur équipé des modules de service de la ressource
 

cathodique

XLDnaute Barbatruc
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
bonne soirée ;)
Bonjour,

@patricktoulon : Merci pour tes explications.

Le code plante

testToulon.gif

Merci. Bonne journée

Edit: DVP a laissé des traces, dommage pour XLD. Et ce, malgré tes interventions pertinentes et instructives.
j'ai simplifié aussi la compil ton truc me faisait dormir debout
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
En fait, présentement je n'ai pas de fichier.
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é :
 

cathodique

XLDnaute Barbatruc
J'ai retrouvé un fil assez récent où je joignis un classeur équipé des modules de service de la ressource
Rebonjour Dranreb:),

Merci beaucoup pour le lien du fil.

Bonne journée.
 

patricktoulon

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

cathodique

XLDnaute Barbatruc
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
Bonjour Patrick,

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

Mais comment alimenter les textboxs?

Merci.
 

patricktoulon

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

cathodique

XLDnaute Barbatruc
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
;)
C'est impeccable👏👏👏👏👏👏. Merci beaucoup;).

Bonne journée.
 

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 810
dernier inscrit
mohammedaminelahbali