Tri automatique listbox en fonction de saisie combobox

Jonathan1986

XLDnaute Nouveau
Bonjour à tous, bonjour le forum,

Je fais appel à vous car je suis débutant en vba et ce ue je veux faire dépasse mes connaissances, je n'ai e plus pas trouvé de solutions sur les forums (ou n'ai pas le niveau pour adapter certains codes), j'espère que quelqu'un aura un peu de temps à me consacrer :)

Voila j'ai un UF qui choisi des produits pour les mettre dans le tableau d'un autre onglet (je n'ai pas encore codé la copie d'un produit). Le problème est que j'aurais beaucoup de produits. Actuellement quand je fais un choix dans la listbox, deux valeur texte sont renvoyées dans deux combobox. Je voulais savoir s'il y avait un moyen de filtrer le tableau source quand on saisie dans une des deux combobox (source combo1 = colonne A, source combo2=colonne B).

Par exemple si je tape ELI dans la combo1 je voudrais que le tableau de la listbos n'affiche que les lignes pour lesquelles la valeur de la colonne A commence par ELI.

Voici le code qui met ma sélection dans les controls :


' Initialisation UF
Private Sub UserForm10_Initialize()
Dim i&, fin&, aa
With Feuil10
fin = .Range("A" & Rows.Count).End(xlUp).Row
aa = .Range("A2:T" & fin)
For i = 1 To UBound(aa)
aa(i, 20) = i + 1
Next i
L2.List = aa
End With
End Sub



' sélection dans LB et affichage dans les TB
Private Sub L2_Click()
Dim lag&, aa
Dim CTRL As Control
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
CTRL = ""
End If
Next CTRL

If L2.ListIndex = -1 Then Exit Sub
On Error Resume Next
With Feuil7
CB1 = L2.List(L2.ListIndex, 0)
CB2 = L2.List(L2.ListIndex, 1)
TB1 = L2.List(L2.ListIndex, 4)
TB2 = L2.List(L2.ListIndex, 17)
TB3 = L2.List(L2.ListIndex, 18)
TB4 = L2.List(L2.ListIndex, 5)
TB7 = L2.List(L2.ListIndex, 3)
TB8 = TB7
TB10 = L2.List(L2.ListIndex, 6)
TB11 = L2.List(L2.ListIndex, 7)
TB12 = L2.List(L2.ListIndex, 8)
TB13 = L2.List(L2.ListIndex, 9)
TB14 = L2.List(L2.ListIndex, 10)
TB15 = L2.List(L2.ListIndex, 11)
TB16 = L2.List(L2.ListIndex, 12)
TB17 = L2.List(L2.ListIndex, 13)
TB26 = Application.VLookup(TB10, Range("Tableausans1"), 3, False)
TB27 = Application.VLookup(TB11, Range("Tableausans1"), 3, False)
TB28 = Application.VLookup(TB12, Range("Tableausans1"), 3, False)
TB29 = Application.VLookup(TB13, Range("Tableausans1"), 3, False)
TB30 = Application.VLookup(TB14, Range("Tableausans1"), 3, False)
End With
End Sub

Je voudrais que quand l'on tape dans CB1 ou CB2 la listbox se trie ...

Merci d'avance pour votre aide et votre temps :)
a+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Jonathan, bonjour le forum,

Sans le fichier qui va avec difficile de t'aider... Si le fichier est trop lourd, tu pars d'un fichier vierge. Tu renommes les onglets
(uniquement les onglets nécessaire à l'exécution du code qui pose problème), les plages nommées, tu copie l'Userform. Bref, tu lui donnes la même structure que l'original avec juste une poignée de données non confidentielles. Après on en reparle...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Jonathan, bonjour le forum,

D'abord trois incohérences ! L'initialisation de l'UserForm10 ne se fait pas parce que tu as écrit le nom de l'UserForm :

Code:
Private Sub UserForm10_Initialize()
la bonne syntaxe est :
Code:
Private Sub UserForm_Initialize()
quel que soit le nom de l'UserForm...

Si je rétablis cette procédure d'initialisation, il me semble que tu t'es trompé d'onglet :
Code:
With Feuil10
je pense que c'est plutôt With Feuil7.

Ensuite tu veux alimenter la listbox L2 alors qu'elle a machines comme propriété RowSource. C'est incompatible ! Soit on alimente et RowSource est vide, soit c'est RowSource qui alimente...

Du coup je suis pas allé plus loin. J'attends tes explications...
 

Jonathan1986

XLDnaute Nouveau
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Robert,
Merci beaucoup pour tes remarques! :)
Ensuite c'est justement là que je bloque, j'imagine qu'il faut enlever la ppté rowsource du tableau et la code pour appliquer un filtre en fonction des saisie de CB1 et CB2 mais je ne vois pas du tout comment faire ...
Encore merci
a+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Jonathan, bonjour le forum,

En pièce jointe ton fichier modifié. J'ai rajouté deux textboxes. La première va filtrer sur la colonne A, la seconde sur la colonne B.
Le fichier :
 

Pièces jointes

  • Jonathan _v01.xlsm
    570.7 KB · Affichages: 369

Jonathan1986

XLDnaute Nouveau
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Robert, Bonjour le forum
J'abuse encore un peu de ta gentillesse si tu en as le temps
Ton code marche bien mais je voudrais que : si l'utilisateur renseigne une valeur dans la textbox1 et ensuite l'efface alors la rowsource de la listbox est le tableau entier.
J'ai simplement essayé de mettre "If textbox = "" Then L2.Rowsource = Tableau2 lais cela ne fonctionne pas
Aurais-tu une idée
Encore merci à toi :)
Jo

PS : le code avec le if en plus :
Private Sub TextBox1_Change()
Dim cel As Range 'déclare la variable cel (CELlule)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim li As Range 'déclare la variable li (LIgne)
Dim tli As Variant 'déclare la variable tli (Tableau de LIgnes)
If TextBox1 = "" Then
L2.RowSource = Tableau2
Else
L2.Clear 'vide la listbox L2
Set li = Feuil7.Range("A1") 'définit la plage li
Set r = pl.Find(Me.TextBox1.Value, , xlValues, xlPart) 'définit la recherhe r
If Not r Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
pa = r.Address 'définit la'adresse de la première occurrence trouvé
Do 'exécute
'redéfinit la plage li
Set li = IIf(li.Cells.Count = 1, Feuil7.Range(r, r.Offset(0, 18)), Application.Union(li, Feuil7.Range(r, r.Offset(0, 18))))
tli = li 'définit le tableau tli
L2.List = tli 'alimente la listbox l2
Set r = pl.FindNext(r) 'redéfinit la recherche r (occurrence suivante)
Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrence ailleurs qu'an pa
End If 'fin de la condition
End If
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Tri automatique listbox en fonction de saisie combobox

Bonjour Jonathan, bonjour le forum,

Comme expliqué plus haut, on ne peut pas mélanger Alimentation par tableau ou par Range et RowSource.
Je te propose plutôt ce bout de code déjà actif dans la version 02 :

Code:
If Me.TextBox1.Value = "" Then 'condition'si la TextBox1 est vide
    tli = Feuil7.Range(pl, pl.Offset(0, 18)) 'définit le tableau tli
    L2.List = tli 'alimente la listbox L2
    Exit Sub 'sort de la procédure
End If 'fin de la condition
Le fichier :
 

Pièces jointes

  • Jonathan _v02.xlsm
    571.9 KB · Affichages: 348

jeanba

XLDnaute Occasionnel
Bonjour le Forum,

Je reprends cette discussion pour souligner le fait que j'ai fait des recherches avant de vous poser mon souci actuel.

La solution de Robert pour le problème posé par Jo 1986 ci-dessus est impeccable, sauf que je n'arrive pas à l'adapter tout à fait à ce qui me préoccupe.

Dans mon cas, je voudrais que ma listbox1 s'affiche en fonction de ce qui est sélectionné dans ma listbox2.
Voir le fichier ci-joint.

Merci par avance.

Jeanba
 

Pièces jointes

  • Afficher ListBox en fonction d'autre listbox.xlsm
    19.2 KB · Affichages: 24

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 009
Membres
101 865
dernier inscrit
MLL