Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Trier une combobox

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Electronull

XLDnaute Junior
Salut à tous,

Voilà mon problème, j'ai essayé avec ChatGPT, mais j'ai un petit problème.
Dans ma combobox, j'ai 2 col, nom produits et prix, je voudrais qu'à chaque lettre tapée, il trie automatiquement la liste des produits.
Avec ChatGPT ça fonctionne mais je n'ai plus le prix disponible.

Comment feriez-vous pour trier la list.

Merci
 
Je ne peux pas mettre le fichier, même anonymisé.
Mais c'est juste une combobox sur un UserForm avec deux colonnes issues d'un tableau qui se trouve dans un autre classeur ouvert dont il faut récupérer le prix qui se trouve dans la colonne 2 après le filtre et sélection du produit
 
Bonsoir
cherche dans le forum avec le pseudo @job75 ou @patricktoulon y compris dans les ressources
tu devrais y trouver la fonction utilisant le tri quicksort sur un tableau multi dimensions
parti de la avec un textbox ou même taper directement les première lettres dans la combo devrait te donner le résultat escompté
excel Downloads est équipé d'un moteur de recherche sert toi en 😉
 
Bonjour à tous,

On parle de filtrer mais s'il s'agit d'une recherche intuitive c'est bien simple :
VB:
Private Sub ComboBox1_GotFocus()
ComboBox1_Change
End Sub

Private Sub ComboBox1_Change()
Dim crit$, tablo, i&, a(), n&
crit = "*" & LCase(ComboBox1) & "*"
tablo = [Tableau1]
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 1)) Like crit Then
        ReDim Preserve a(1, n)
        a(0, n) = tablo(i, 1)
        a(1, n) = tablo(i, 2)
        n = n + 1
    End If
Next
If n Then ComboBox1.List = Application.Transpose(a) Else ComboBox1.Clear
End Sub
A+
 

Pièces jointes

Oui, en effet, c'est court et fonctionnel
Ceci dit, quand je tape c, j'ai directement c1 et la liste se limite au seul c1 et non c1,c2,c3,c4
 
Voici le code qui fonctionne

VB:
Private Sub ComboBox_Produit_Change()
    Dim wb As Workbook, ws As Worksheet, tbl As ListObject
    Dim arr As Variant
    Dim rLo As Long, rHi As Long, cLo As Long
    Dim saisie As String
    Dim i As Long, cnt As Long, idx As Long
    Dim tmp As Variant

    On Error GoTo ErrHandler

    ' Vérif classeur ouvert
    Set wb = Workbooks("Donnees.xlsx")
    Set ws = wb.Worksheets("Liste des produits")
    Set tbl = ws.ListObjects("T_Produits")

    ' charger toutes les données du tableau (DataBodyRange)
    arr = tbl.DataBodyRange.Value

    ' déterminer bornes 
    rLo = LBound(arr, 1): rHi = UBound(arr, 1)
    cLo = LBound(arr, 2) ' colonne 1 du tableau = nom produit ; colonne 2 = prix

    saisie = UCase(Trim(Me.ComboBox_Produit.Text))

    ' 1) compter correspondances
    cnt = 0
    For i = rLo To rHi
        If saisie = "" Or Left$(UCase(CStr(arr(i, cLo))), Len(saisie)) = saisie Then
            cnt = cnt + 1
        End If
    Next i

    ' si rien trouvé => vider et sortir
    If cnt = 0 Then
        Me.ComboBox_Produit.Clear
        Me.TextBox_Prix_Unit = ""
        Exit Sub
    End If

    ' 2) dimensionner un tableau
    ReDim tmp(0 To cnt - 1, 0 To 1) ' 2 colonnes : 0=nom, 1=prix

    ' 3) remplir tmp
    idx = 0
    For i = rLo To rHi
        If saisie = "" Or Left$(UCase(CStr(arr(i, cLo))), Len(saisie)) = saisie Then
            tmp(idx, 0) = CStr(arr(i, cLo))
            tmp(idx, 1) = arr(i, cLo + 1)   ' prix dans la colonne suivante
            idx = idx + 1
        End If
    Next i

    ' 4) affecter à la ComboBox
    With Me.ComboBox_Produit
        .ColumnCount = 2
        .ColumnWidths = "200 pt;0 pt" ' masquer la colonne prix
        .List = tmp
    End With

    '  si saisie est exactement un produit, afficher le prix
    For i = 0 To Me.ComboBox_Produit.ListCount - 1
        If StrComp(Me.ComboBox_Produit.List(i, 0), Me.ComboBox_Produit.Text, vbTextCompare) = 0 Then
            Me.TextBox_Prix_Unit = Format(Me.ComboBox_Produit.List(i, 1), "0.00 €")
            Exit For
        Else
            Me.TextBox_Prix_Unit = ""
        End If
    Next i

    Exit Sub

ErrHandler:
    MsgBox "Erreur " & Err.Number & " : " & Err.Description, vbExclamation
End Sub
 
Bonjour le forum,
Chez moi #21 ne fonctionne pas 100 % correctement
La macro du post #21 fonctionne bien, mais pour n = 1 la liste de la ComboBox est une colonne au lieu d'être une ligne.

Si l'on veut éviter ça il faut compliquer un peu :
VB:
Private Sub ComboBox1_GotFocus()
ComboBox1_Change
End Sub

Private Sub ComboBox1_Change()
Dim crit$, tablo, i&, a(), n&, lig&
crit = "*" & LCase(ComboBox1) & "*"
tablo = [Tableau1]
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 1)) Like crit Then
        ReDim Preserve a(1, n)
        a(0, n) = tablo(i, 1)
        a(1, n) = tablo(i, 2)
        n = n + 1
        If n = 1 Then lig = i
    End If
Next
With ComboBox1
    If n = 0 Then .Clear
    If n = 1 Then .List = [Tableau1].Rows(lig).Value
    If n > 1 Then .List = Application.Transpose(a)
End With
End Sub
A+
 

Pièces jointes

Eh bien ce n'est pas fini.

Avec la propriété MatchEntry de ComboBox1 sur fmMatchEntryComplete voici ce qui se passe quand on entre la lettre C :

- le 1 s'affiche en surbrillance, je l'efface => la liste de ComboBox1 affiche C1 C2 C3 C4, c'est correct

- j'ajoute 1 à C => la liste de ComboBox1 affiche toujours C1 C2 C3 C4 et non pas C1.

Pour éviter cela il faut mettre MatchEntry sur fmMatchEntryNone :
VB:
Private Sub ComboBox1_GotFocus()
ComboBox1_Change
End Sub

Private Sub ComboBox1_Change()
Dim crit$, tablo, i&, a(), n&, lig&
crit = "*" & LCase(ComboBox1) & "*"
tablo = [Tableau1]
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 1)) Like crit Then
        ReDim Preserve a(1, n)
        a(0, n) = tablo(i, 1)
        a(1, n) = tablo(i, 2)
        n = n + 1
        If n = 1 Then lig = i
    End If
Next
With ComboBox1
    .MatchEntry = fmMatchEntryNone
    If n = 0 Then .Clear
    If n = 1 Then .List = [Tableau1].Rows(lig).Value
    If n > 1 Then .List = Application.Transpose(a)
End With
End Sub
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
176
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…