Affichage d'un tri (par filtre ) dans un usrform

christophedb

XLDnaute Nouveau
Bonjour la communauté,
Ce site est vraiment super utile, j'ai eu quelques indications et astuces grâce a celui-ci.
Un énième soucis me redirige vers vous
j'ai fait une petite appli pour le boulot que je vais devoir intégrer plus tard dans une base de données.

Elle permet :
de sélectionner sur un filtre (via comboBox) une liste déroulante correspondant aux critères du dit filtre.
d'afficher cette série récupérée dans une listBox
enfin d'afficher le nombre d’occurrences trouvées dans un textBox

la sélection et le tri fonctionnent.
sinon :
1.1 dans la listbox, si je veux afficher 1 colonne cela fonctionne mais si je veux étendre la sélection à plusieurs colonnes, elle me renvoie toute les données à la suite de l'autre,
j'aimerais en fait voir s'afficher dans la listbox toute les données ligne par ligne.
1.2 dans la feuille Excel, il y a des données ( en rouge pour l'exemple que je dois conserver mais pas afficher lors du tri et en vert les données que je dois absolument afficher )
1.3 dans le même userform, si je reprend un autre filtre, il laissera affiché la précédente sélection
Enfin, pour terminer je n'arrive pas à indiquer dans le txtbox l'addition des occurrences trouvées.

Ci joint le fichier,
Pouvez-vous m'aider et m'expliquer mes erreurs.
 

Pièces jointes

  • cdb2014.xlsm
    80.3 KB · Affichages: 42

Robert

XLDnaute Barbatruc
Repose en paix
Re : Affichage d'un tri (par filtre ) dans un usrform

Bonjour Christophe, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :

Code:
Private O As Worksheet 'déclare la variable O (Onglet)
Private DL As Integer 'déclare la variable DL (Dernière Ligne)
Private PL As Range 'déclare la variable PL (PLage)
Private PLV As Range 'déclare la variable PLV (PLage Visible)


Private Sub UserForm_Initialize()
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)

Set O = Worksheets("Trav") 'définit l'onglet O
If O.FilterMode = True Then O.Range("A2").AutoFilter 'si l'onglet est filtrée, supprime le filtre
Me.ListBox1.ColumnCount = 6 'définit le nombre de colonne de la ListBox1 (6 colonnes de 0 à 5)
Me.ListBox1.ColumnWidths = "55 pt;55 pt;55 pt;55 pt;55 pt;0 pt" 'définit la largeur des colonnes de la Listbox1 ( la dernière =0 est cachée)
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O
Set PL = O.Range("A3:A" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL.Offset(0, 10) 'boucle sur toutes les cellule CEL de la plage PL décalée de 10 colonnes à droite (=colonne K)
    D(CEL.Value) = "" 'alimente le dictionnaire D
Next CEL 'prochaine cellule de la boucle
Me.ComboBox1.List = D.keys 'récupère la liste des éléments du dictionnaire sans doublon
End Sub


Private Sub ComboBox1_Click()
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim I As Byte 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)

O.Range("A2").AutoFilter 11, ComboBox1.Value 'filtre la colonne K de l'onglet O avec la valeur de la ComboBox1 comme critère
Set PL = PL.Offset(0, 2) 'redéfinit la plage PL (colonne C)
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (cellules visibles de la palge PL)
For Each CEL In PLV 'boucle 1 : sur toutes les cellules CEL de la plage PLV
    With Me.ListBox1 'prend en compte la ListBox1
        .AddItem CEL.Value 'ajoute la valeur de la cellue CEL à la ListBox1 (colonne 0)
        For I = 1 To 4 'boucle 2:  sur les colonnes 1 à 4 de la ListBox1
            Select Case I 'agit en fonction de I
                Case 1, 2, 3 'cas où I vaut 1, 2 et 3
                    J = I + 3 'définit la variable J
                Case 4 'cas où I vaut 4
                    J = I + 7 'définit la variable J
            End Select 'fin de l'action en fonction de I
            .Column(I, .ListCount - 1) = O.Cells(CEL.Row, J) 'rajoute dans la colonne I de la Listox1 les données en vert
        Next I 'prochaine colonne de la boucle 2
        .Column(5, .ListCount - 1) = CEL.Row 'rajoute dans la colonne 5 (cachée) de la ListBox1 le numéro de ligne (pourra te servir ultérieurement***)
    End With 'fin de la prise en compte de la ListBox1
Next CEL 'prochaine cellule de la boucle 1
Me.TextBox1.Value = Me.ListBox1.ListCount 'rajoute dans le TextBox1 le nombre d'éléments de la ListBox1
Me.ComboBox1.RemoveItem (Me.ComboBox1.ListIndex) 'supprime de la ComboBox1 l'élément sélectionné
End Sub


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans la ListBox1***
Dim LI As Integer 'déclare la variable LI (LIgne)

With Me.ListBox1 'prend en compte la ListBox1
    LI = .Column(5, .ListIndex) 'récupère la ligne de l'élément double-cliqué
End With 'fin de la prise en compte de la ListBox1
O.Range("A2").AutoFilter 'supprime le filtre
O.Cells(LI, 1).Resize(1, 11).Select 'sélectionne la ligne de l'élément double-cliqué
Unload Me 'vide et ferme l'UserForm
End Sub


Private Sub CommandButton2_Click() 'bouton "Exit"
If O.FilterMode = True Then O.Range("A2").AutoFilter 'si l'onglet est filtrée, supprime le filtre
Unload Me 'vide et ferme l'UserFomr
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'à la fermeture par la croix
If O.FilterMode = True Then O.Range("A2").AutoFilter 'si l'onglet est filtrée, supprime le filtre
End Sub

• L'alimentation de la ComboBox1 se faite de manière dynamique à l'aide d'un dictionnaire (attention tu avais "cuisine" et "cuisine " (avec un espace à la fin). Corrige pour éviter d'avoir ces deux éléments dans la ComboBox1)

• J'ai supprimé le bouton go puisque tout ce fait au clic dans la ConboBox1. J'ai même ajouté, au as où, une action au double-clic dans un des éléments de la ListBox1.
Le Fichier :
 

Pièces jointes

  • Christophe_v01.xlsm
    34.2 KB · Affichages: 47

christophedb

XLDnaute Nouveau
Re : Affichage d'un tri (par filtre ) dans un usrform

Robert,

Décidément tu es mon sauveur,
je te remercie pour ton implication.
Ton code fonctionne à merveille,
mille merci
Je vais essayer de le comprendre et j'aurai certainement quelques questions a te poser a son sujet.
à bientôt
 

Discussions similaires

Statistiques des forums

Discussions
312 201
Messages
2 086 171
Membres
103 151
dernier inscrit
nassim