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

cathodique

XLDnaute Barbatruc
J’imagine que c'est assez compliqué.
De mon côté j'ai dû bloquer l'évènement combobox_click pour avancer (plantage).
Je suis parvenu à filtrer. Cependant, ça ne fonctionne pas parfaitement. En effet, lorsqu'il ne reste qu'une seule ligne, les données s'affichent dans une colonne. J'avoue ne rien comprendre.
VB:
Private Sub ComboBox1_Change()
    Dim cle, tmp(), i As Byte
    cle = "*" & Me.ComboBox1 & "*"
    For i = 1 To UBound(Tb)
        a = Tb(i, 1) & Tb(i, 2) & Tb(i, 3)
        Debug.Print a
        If a Like cle Then
            n = n + 1
            ReDim Preserve tmp(1 To 3, 1 To n)
            For k = 1 To 3
            tmp(k, n) = Tb(i, k)
            Next k
        End If
    Next i
   
    If n = 1 Then
    Me.ComboBox1.List = tmp
    ElseIf n > 1 Then
    Me.ComboBox1.List = Application.Transpose(tmp)
    Else
    Me.ComboBox1.Clear
    End If
    Me.ComboBox1.DropDown
End Sub
Merci.

Bonne soirée.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour:),

Depuis hier, je cherche une solution. Plutôt, une explication.
Je ne comprends pas pourquoi au filtrage lorsqu'il ne reste qu'une seule ligne, l'affichage dans la liste de la combobox change.
pourquoi.gif

J'ai écumé pas mal de discussions et consulté beaucoup d'exemples de Boisgontier. Sans trouver de réponse.

Merci d'aider.

Bonne journée.
 

cathodique

XLDnaute Barbatruc
Bonjour.
Pourquoi vous réécrivez vous un code qui fait la même chose que WorkseetFunction.Transpose quand n = 1 ?
Bonjour Dranreb;),

Enfin, une participation et je t'en remercie.
Je fonctionne avec mes petites connaissances quand ma mémoire ne me joue pas des tours.
D'après ta question, je déduis que WorsheetFunction.Transpose fait ce que fait mon bout de code.

Pour être franc, je me débats depuis hier matin. J'ai utilisé Application.Transpose, puis après cherche sur le forum et ne net. J'ai essayé WorsheetFunction.Transpose que j'ai dû mal utilisé dans le code.

Je n'ai pas encore testé ta proposition. Je reviendrai aux nouvelles.

Merci.
 

cathodique

XLDnaute Barbatruc
Bonjour Dranreb;),

Enfin, une participation et je t'en remercie.
Je fonctionne avec mes petites connaissances quand ma mémoire ne me joue pas des tours.
D'après ta question, je déduis que WorsheetFunction.Transpose fait ce que fait mon bout de code.

Pour être franc, je me débats depuis hier matin. J'ai utilisé Application.Transpose, puis après cherche sur le forum et ne net. J'ai essayé WorsheetFunction.Transpose que j'ai dû mal utilisé dans le code.

Je n'ai pas encore testé ta proposition. Je reviendrai aux nouvelles.

Merci.
Je reviens aux nouvelles, ça ne fonctionne pas ou j'ai mal utilisé la fonction.
VB:
If n = 1 Then
t = WorksheetFunction.Transpose(tmp)
Me.ComboBox1.List = t
Même problème rencontré, la liste de la combobox affiche 3 lignes en 1 colonne
1612956486235.png
 

Dranreb

XLDnaute Barbatruc
Vous avez raison, c'est le WorksheetFunction.Transpose qui réagit mal quand il n'y a qu'une colonne: au lieu de renvoyer un tableau 2 D d'une seule ligne il renvoie un tableau d'une seule dimension. Je n'utiliserai plus jamais cette fonction dorénavant. Je déroulerai toujours un code pour savoir combien de lignes il me faut, et le dimensionnerai ensuite dans le bon sens avant de le remplir. Je le faisais d'ailleurs déjà comme ça le plus souvent. Mais désormais je ne ferai plus jamais autrement.
 

cathodique

XLDnaute Barbatruc
Notez que je n'utilise jamais les ComboBox en multi-colonnes. C'est tellement simple à gérer avec 3 ComboBox prises en charge par mon ComboBoxLiées …
@Dranreb : En effet, c'est beaucoup plus simple de gérer des combobox à une seule colonne.

Sur le fichier que j'améliore bénévolement et gracieusement pour une association de protection animale, j'ai opté pour cette approche de 3 colonnes dont la dernière est cachée, pour permettre à l'utilisateur de choisir le bon code de compte. Car il n'est pas facile de retenir le code et son libellé. D'où cette idée de concaténer les 3 colonnes. Tout compte fait, la 3ème n'est pas vraiment nécessaire dans la concaténation.

Ton idée de ComboBoxLiées est super (que tu m'as envoyé, il y a un moment). Mais que je n'utilise pas car il faut installer la macro complémentaire. Donc si j'aide quelqu'un (toujours gracieusement), je ne peux lui demander d'installer un complément. Et, bien souvent ne savent pas s'y prendre.
En tout cas merci pour ta participation. à la prochaine;)
 

cathodique

XLDnaute Barbatruc
On peut aussi équiper le classeur des modules de service nécessaires. Il y en a juste un peu beaucoup: un module standard et 12 modules de classe.
Re, Dranreb

Les modules de classe. En fait, c'est ma bête noire. J'avoue que je ne me suis jamais mis sérieusement pour les étudier. J'ai demandé de l'aide pour par exemple gérer plusieurs boutons ou textbox.
Oui, je veux bien. J'aurai au moins une base à étudier. ça pourrait m’inciter à m'y mettre sérieusement. Merci.

Bonne soirée.
 

patricktoulon

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 ;)
 
Dernière édition:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin