Microsoft 365 ComboBox Liés pour Filtre ListView

TCHIS

XLDnaute Occasionnel
Bonjour le forum

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 🤔🤔🤔 ?

Voici un extrait du la ListView et des Contrôles
1683544379625.png
 
Solution
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.
Démo_.gif

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.

P.

TCHIS

XLDnaute Occasionnel
@TooFatBoy
Peux-tu nous expliquer un peu plus précisément le(s) problème(s) que des TS te poseraient, stp ?
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.
 

p56

XLDnaute Occasionnel
Bonjour à tous,

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

P.
 

Pièces jointes

  • Combo_liées _2023_ListView_sans_TS.xlsm
    89.7 KB · Affichages: 2

TooFatBoy

XLDnaute Barbatruc
oui je peux si par TS tu parles des tableaux
Par "TS" je parle de Tableaux Structurés et non de simples tableaux. Mais tu le sais déjà puisqu'on a pas mal parlé à ce sujet. ;)


le fichier est destiné à être utiliser sur réseau
Si le classeur n'est pas partagé par Excel, ça ne pose pas de problème normalement. 😉


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

XLDnaute Occasionnel
Bonjour à tous,

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

P.
Merci d'avoir réagi aussi vite sincèrement merci. je te reviens d'ici peut si peut me le permet
Idem @TooFatBoy 🙏 🙏
 

p56

XLDnaute Occasionnel
Re,

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

TCHIS

XLDnaute Occasionnel
Re,

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.
Re,
@p56 encore merci de consacré de ton temps

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

p56

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

Pièces jointes

  • Combo_liées _2023_ListView_sans_TS.xlsm
    96.2 KB · Affichages: 11

TCHIS

XLDnaute Occasionnel
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.
ça marche
 

TCHIS

XLDnaute Occasionnel
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
 

TCHIS

XLDnaute Occasionnel
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
 

Discussions similaires