J'ai besoin d'aide pour élaborer une macro de filtre d'une ListView en fonction des critères choisis dans mes combobox le point particulier est que ces ComboBox doivent liées entre elles je veux dire par là que lorsqu'on applique un filtre sur un Critère les Critères restant présenteront leurs données de filtres en fonctions du filtre précédant ainsi de suite.
La particularité c'est que j'ai 9 critères de filtres (9ComboBox) et le filtre ne suit pas un ordre quelconque je veux dire par là qu'on est libre de commencer à filtrer à partir de n'importe quel critère(Voilà pourquoi je me demande si la méthode de filtre en cascade avec les différents Combobox) peut passer ?
Bonjour à tous,
Je me permets de proposer une solution via un module de classe.
Ici il est possible de revenir en arrière pour chaque choix en sélectionnant l'entête dans la liste déroulante. Il y a également un reset pour l'ensemble des filtres.
Le code principal est contenu dans le module de classe, + quelques lignes à ajouter dans le code de l'usf.
En PJ, 2 versions avec ou sans listview (usf simplifié pour ne montrer que la fonction filtre)
Nb : pour ce code, on renseigne le tag des combobox avec le n° de la colonne correspondante. Le code est alors fonctionnel sans modif quelque soit le nombre de combobox.
oui je peux si par TS tu parles des tableaux
Eh bien le fichier est destiné à être utiliser sur réseau l'élaboration du tableaux de bord est en grande partie centré sur des graphiques lesquels doivent être conçu par VBA or avec les tableaux sur l'une de mes première version j'avais commencer à concevoir un tableau de bord sur lequel il y a vait des graphiques sauf qu'en étant monté à partir de tableaux (Tableaux normaux, TCD) j'ai remarquer que le fichier ralentissait en plus du fait qu'à chaque action une erreur se répète constamment.
@TCHIS :
* même s'il est dommage de se passer de Tableau Structurés, c'est très simple à modifier. Il suffit de changerr une ligne par 4 autres comme ceci :
VB:
Sub Filtre(Optional b As Byte)
Dim Td As Variant, lg As Long, Ctrl As Control
With Sheets("BD_NATIFS")
lg = .Cells(Rows.Count, "A").End(xlUp).Row
Td = Select_Td(.Range("A1:Q" & lg).Value)
End With
'Td = Select_Td(Range("Natifs_GO").ListObject.Range.Value)
For Each Ctrl In Usf.Controls
If TypeName(Ctrl) = "ComboBox" And Not Ctrl.Tag = "" Then Ctrl.List = T_Unik(Td, Ctrl.Tag)
Next Ctrl
Remplir_Lvw_NATIFS Td
End Sub
* à noter, ci-joint un fichier démo, mais je n'interviendrai pas sur votre fichier dans lequel le code est quelque peu en fouillis ... (essayez de faire des copier/coller propres ...)
l'élaboration du tableaux de bord est en grande partie centré sur des graphiques lesquels doivent être conçu par VBA or avec les tableaux sur l'une de mes première version j'avais commencer à concevoir un tableau de bord sur lequel il y a vait des graphiques sauf qu'en étant monté à partir de tableaux (Tableaux normaux, TCD) j'ai remarquer que le fichier ralentissait en plus du fait qu'à chaque action une erreur se répète constamment.
Si le fichier est lent, ça ne vient probablement pas des tableaux (ni "normaux", ni structurés).
Souviens-toi de ta macro qui mettait plus d'une minute pour remplir un tableau, tout simplement parce qu'une des macros était appelée plus de 2500 fois au lieu d'une seule fois.
Si tu as une erreur, c'est qu'il y a un problème dans ton code.
@TCHIS :
* même s'il est dommage de se passer de Tableau Structurés, c'est très simple à modifier. Il suffit de changerr une ligne par 4 autres comme ceci :
VB:
Sub Filtre(Optional b As Byte)
Dim Td As Variant, lg As Long, Ctrl As Control
With Sheets("BD_NATIFS")
lg = .Cells(Rows.Count, "A").End(xlUp).Row
Td = Select_Td(.Range("A1:Q" & lg).Value)
End With
'Td = Select_Td(Range("Natifs_GO").ListObject.Range.Value)
For Each Ctrl In Usf.Controls
If TypeName(Ctrl) = "ComboBox" And Not Ctrl.Tag = "" Then Ctrl.List = T_Unik(Td, Ctrl.Tag)
Next Ctrl
Remplir_Lvw_NATIFS Td
End Sub
* à noter, ci-joint un fichier démo, mais je n'interviendrai pas sur votre fichier dans lequel le code est quelque peu en fouillis ... (essayez de faire des copier/coller propres ...)
Voici pour la 2ème partie de la question : sélection de la ligne de données au clic sur une ligne de la Listview.
Le code (dans l'usf):
VB:
Private Sub Lvw_NATIFS_Click()
Dim Id As Long, lg As Long
Id = Lvw_NATIFS.SelectedItem
With Sheets("BD_NATIFS")
lg = Application.Match(Id, .Range("A:A"), 0)
.Rows(lg).Select
End With
End Sub
Le fichier démo joint. A noter : ajout d'une colonne en A pour avoir un n° d'identification des lignes. Cet Id est repris dans la listview de façon invisible (largeur colonne =1)
P.
Edit suppression du fichier qui avait un défaut. Voir mon message suivant.
Voici pour la 2ème partie de la question : sélection de la ligne de données au clic sur une ligne de la Listview.
Le code (dans l'usf):
VB:
Private Sub Lvw_NATIFS_Click()
Dim Id As Long, lg As Long
Id = Lvw_NATIFS.SelectedItem
With Sheets("BD_NATIFS")
lg = Application.Match(Id, .Range("A:A"), 0)
.Rows(lg).Select
End With
End Sub
Le fichier démo joint. A noter : ajout d'une colonne en A pour avoir un n° d'identification des lignes. Cet Id est repris dans la listview de façon invisible (largeur colonne =1)
P.
il se trouve que lorsque je lance le formulaire deux points sont à noter chez moi malgré le fait que j'ai parfaitement recopié ton code.
Premièrement la ListView ne charge pas à l'ouverture du formulaire mais seulement une fois fait un choix sur un critère de filtre
Deuxièmement malgré ce choix quand la listView se rempli celle-ci présente toutes les données autrement aucun filtre par contre les ComBoBox elles sont bien liées
Et pour la sélection de la ligne cela semble marché je dis ça car tan que le filtre n'est pas correctement appliqué je ne peux le savoir vraiment je me permet de mettre en copie le fichier stp
Re,
Comme indiqué précédemment, je ne corrigerai pas votre fichier, je me limite simplement à donner des démo fonctionnelles.
En revanche dans la version précédente j'ai oublié d'incrémenter de 1 les tags des combobox (donc décalage)
Voici une version qui corrige ce décalage et qui me semble fonctionnelle.
Avec ça à vous de bien reprendre l'ensemble dans votre fichier pour que ça fonctionne.
Vous pouvez le faire, just do it.
P.
Re,
Comme indiqué précédemment, je ne corrigerai pas votre fichier, je me limite simplement à donner des démo fonctionnelles.
En revanche dans la version précédente j'ai oublié d'incrémenter de 1 les tags des combobox (donc décalage)
Voici une version qui corrige ce décalage et qui me semble fonctionnelle.
Avec ça à vous de bien reprendre l'ensemble dans votre fichier pour que ça fonctionne.
Vous pouvez le faire, just do it.
P.
Mais dit moi stp, la macro qui fait le remplissage de la Listview en Remplir_ListView2 (Dans mon cas) et cette macro est appelé dans le module classe que j'ai nommé Recherche_Natif plus précisément dans la procédure Recherche comme ceci
VB:
Dim Td As Variant, lg As Long, Ctrl As Control
With Sheets("BD_NATIFS")
lg = .Cells(Rows.Count, "B").End(xlUp).Row
Td = Select_Td(.Range("B1:R" & lg).Value)
End With
'Td = Select_Td(Range("Natifs_GO").ListObject.Range.Value)
For Each Ctrl In UserForm1.Controls
If TypeName(Ctrl) = "ComboBox" And Not Ctrl.Tag = "" Then Ctrl.List = T_Unik(Td, Ctrl.Tag)
Next Ctrl
Remplir_ListView2 Td 'Usf.ListBox1.List = Td
Qui elle meme est appelé dans l'évènement activate du formulaire comme ceci
Code:
Private Sub UserForm_Activate()
ClsUserform1.Initialize
ClsUserform1.Recherche
En_tetes_ListView2
End Sub
Dans ce cas de figure où selon moi j'ai parfaitement suivi la procédure saurais-tu s'il te plait qu'est ce qui déconne pour que :
*****la ListView ne se remplie pas dès l'ouverture autrement dit l'activation du formulaire
*****et qu'en plus de cela quand on sélectionné un critère de Filtre(Recherche) malgré que les ComboBox soit liées cette ListView au lieu de présenter les données filtrées en fonction de la recherche mais au lieu de cela elle présente à la place l'ensemble dès données autrement elle se charge
J'ai beau chercher je ne vois pourquoi elle s'exécute de cette manière
Re,
Comme indiqué précédemment, je ne corrigerai pas votre fichier, je me limite simplement à donner des démo fonctionnelles.
En revanche dans la version précédente j'ai oublié d'incrémenter de 1 les tags des combobox (donc décalage)
Voici une version qui corrige ce décalage et qui me semble fonctionnelle.
Avec ça à vous de bien reprendre l'ensemble dans votre fichier pour que ça fonctionne.
Vous pouvez le faire, just do it.
P.
Bonjour à tous
Alors @p56 j'ai pu y arriver au final après avoir chercher encore et encore mais j'ai effectivement pu le faire merci à toi et aux autres pour votre aide sincèrement merci