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
Avec le fichier que j'ai envoyé la macro de filtre marche mais les ComboBox ne sont pas liés en plus du fait qu'à l'initialisation j'ai comme l'impression qu'il y le filtre je veux dire parle que la liste présente les lignes vide de la feuille de données
 

Dranreb

XLDnaute Barbatruc
Avez
est-ce que ceci est censé pouvoir se produire ?
Pas si on a effacé la saisie précédente. Mais si on avait commencé par saisir le prénom la ComboBox garde sa liste d'avant le choix.
A l'aide svp je suis censé rendre compte bientôt et là je panique comme jamais
Ne paniquez pas. Contentez vous de mettre les CLs.Add et CAs.Add (c'est précisément ce que j'ai la flemme de faire), joignez tout ça et je ferai le reste.
 

TCHIS

XLDnaute Occasionnel
Bonjour
Ne paniquez pas. Contentez vous de mettre les CLs.Add et CAs.Add (c'est précisément ce que j'ai la flemme de faire), joignez tout ça et je ferai le reste.
@Dranreb en toute sincérité je ne comprends rien de ce que vous me demandez

Bien que la procédure soit bien détaillée le fait qu'elle soit aussi longue la rend complexe
de plus mon souci est que cela demande d'enregistrer le fichier Complément en local tandis que le fichier lui doit être utilisé en réseau est ce que n'est pas déjà un problème je me demande ?

Vraiment je ne comprend rien
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Bravo ! Il n'y avait guère d'erreur dans ce que vous aviez mis.
Après ajout des modules de service, les réactions normales du ComboBoxLiées se sont manifestées.
Puis-je mettre en tête la Sub UserForm_Initialize (c'est toujours ce qui s'exécute en premier) ?
La suite ça va être de sélectionner "CLs" dans la liste de gauche qui surmonte la fenêtre de code: ça va implanter d'office un modèle de prise en charge de son évènement Change, puis de sélectionner "Résultat" dans celle de droite, ce qui va ajouter la prise en charge de celui-ci.
Un tableau Lignes de Long est transmis à cette dernière. Ce sont les numéros des lignes correspondant simultanément à toutes les valeurs qui auront été mises dans les ComboBox prise en charge par CLs.
 

Pièces jointes

  • ClsCasTCHIS.xlsm
    990.1 KB · Affichages: 6
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ceci a l'air de pas mal marcher :
VB:
Private Sub CLs_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   If NbrLgn = 0 Then
' Faire en sorte que la ListView affiche tout, ou pour moi se serait plutôt rien …
' Parce que dans ce cas la Sub CLs_Résultat ne sera pas invoquée.
      End If
   End Sub
Private Sub CLs_Résultat(Lignes() As Long)
   Dim TDon(), LLVw As Long, LDon As Long, C As Integer
   TDon = CLs.PlgTablo.Value
   Lvw_NATIFS.ListItems.Clear
   For LLVw = 1 To UBound(Lignes)
      LDon = Lignes(LLVw)
      With Lvw_NATIFS.ListItems.Add(, , Format(TDon(LDon, 1), ""))
         For C = 2 To 16
            .ListSubItems.Add , , TDon(LDon, C)
            Next C
         End With
      Next LLVw
   End Sub
 

Pièces jointes

  • ClsCasTCHIS.xlsm
    992.1 KB · Affichages: 3

TCHIS

XLDnaute Occasionnel
Bonjour.
Bravo ! Il n'y avait guère d'erreur dans ce que vous aviez mis.
Après ajout des modules de service, les réactions normales du ComboBoxLiées se sont manifestées.
Puis-je mettre en tête la Sub UserForm_Initialize (c'est toujours ce qui s'exécute en premier) ?
La suite ça va être de sélectionner "CLs" dans la liste de gauche qui surmonte la fenêtre de code: ça va implanter d'office un modèle de prise en charge de son évènement Change, puis de sélectionner "Résultat" dans celle de droite, ce qui va ajouter la prise en charge de celui-ci.
Un tableau Lignes de Long est transmis à cette dernière. Ce sont les numéros des lignes correspondant simultanément à toutes les valeurs qui auront été mises dans les ComboBox prise en charge par CLs.
Bonjour
Alors je viens de consulter le fichier je me doute bien que tu as du bien bossé mais sauf je n'y comprend pas combobox sont liés mais pas ce à quoi je m'attendais
j'ai la macro filtre élaboré encore heureux mais ça serait plus efficace si les Combobox était liées je veux dire par là:
Que le filtre (La macro s'applique en cascade ) quand un filtre est appliqué sur un Critère les autres critères restant (ComboBox) affiche les données en fonction du filtres précédant

C'est-à-dire sur le site si le critère de filtre choisis est "DJENO" et que toutes les lignes affichées après filtres si il ne reste comme métier INST & ELEC et le combobox métier ne présentera que les CHOIX INST & ELEC ainsi de suite sachant qu'on est libre de commencer le filtre sur n'importe quel autre critère
 

Dranreb

XLDnaute Barbatruc
Pourquoi ?
Il y a bien aussi des Metier MECA avec Site DJENO. D'ailleurs si vous sélectionnez ce Metier MECA il ne vous affiche plus que ceux là dans la ListView (DJENO et MECA).
Voulez-vous dire qu'il faudrait aussi tenir compte du filtre du tableau dans la feuille ? Ce n'est guère faisable …

Ah je viens de voir qu'il y avait un bouton Réinitialiser. Très simple :
VB:
Private Sub Btn_Réinitialized_Click()
   CLs.Nettoyer
   End Sub
Remarque : J'évite le blanc souligné dans les noms: je ne le réserve que comme séparateur dans les noms des procédures de prise en charge d'évènements entre le nom de l'objet et celui de l'évènement.
 
Dernière édition:

TCHIS

XLDnaute Occasionnel
Pourquoi ?
Il y a bien aussi des Metier MECA avec Site DJENO. D'ailleurs si vous sélectionnez ce Metier MECA il ne vous affiche plus que ceux là dans la ListView (DJENO et MECA).
Voulez-vous dire qu'il faudrait aussi tenir compte du filtre du tableau dans la feuille ? Ce n'est guère faisable …

Ah je viens de voir qu'il y avait un bouton Réinitialiser. Très simple :
VB:
Private Sub Btn_Réinitialized_Click()
   CLs.Nettoyer
   End Sub
Remarque : J'évite le blanc souligné dans les noms: je ne le réserve que comme séparateur dans les noms des procédures de prise en charge d'évènements entre le nom de l'objet et celui de l'évènement.
Je pense que ne demande qu'à être adapter par rapport à mon besoin sauf que comme je ne comprend rien de ce que vous avez fait je suis bloqué c'est trop complexe votre méthode
Je vous remercie du temps que vous m'accorder
 

Dranreb

XLDnaute Barbatruc
Mais qu'est ce qui ne va pas ? Vous semblez dire qu'avec le site DJENO il n'existe que les métiers INST et ELEC dans votre base. C'est faux: Pour DJENO, MECA y est aussi, alors pourquoi ne devrait-il pas être proposé ? Les réactions du ComboBoxLiées sont bien telles que vous les décrivez: il ne propose dans les liste des ComboBox non renseignée que les possibilités compatibles avec celles qui le sont. S'il n'y a qu'une seule possibilité, elle est assumée.
 

TooFatBoy

XLDnaute Barbatruc
Pourquoi ?
Il y a bien aussi des Metier MECA avec Site DJENO. D'ailleurs si vous sélectionnez ce Metier MECA il ne vous affiche plus que ceux là dans la ListView (DJENO et MECA).
Voulez-vous dire qu'il faudrait aussi tenir compte du filtre du tableau dans la feuille ? Ce n'est guère faisable …
Oui, c'est ce que, perso, j'ai compris : les ComboBox ne doivent contenir que ce qu'il reste dans la colonne correspondante de la ListView après filtrage avec le contenu des 9 ComboBox.
 

Dranreb

XLDnaute Barbatruc
Remarquez si vous effacez une ComboBox qui n'a pas été renseignée en dernier, sa liste est corrigée en fonction de celles qu'il l'avaient été. Mais la liste d'une ComboBox ne change plus après qu'un choix y a été fait.
Il vaut souvent mieux réinitialiser d'abord.
 

Dranreb

XLDnaute Barbatruc
Ce serait sans doute faisable mais on perdrait en quelque sorte une notion d'historique de l'orde dans lequel ont été effectués les choix, sans que cela n'apporte rien d'utile. Il suffit de le savoir. La liste contient ce qu'elle contenait quand on y a choisi quelque chose. On ne va quand même pas effacer complètement les listes de toutes les ComboBox sous prétexte que dans l'une d'elle on y a tapé quelque chose qui n'existait pas dans sa seule propre liste ! Le truc est en effet conçu aussi pour de possibles créations.
 

Dranreb

XLDnaute Barbatruc
les ComboBox ne doivent contenir que ce qu'il reste dans la colonne correspondante de la ListView après filtrage avec le contenu des 9 ComboBox.
Alors c'est idiot, réfléchissez, parce que toute ComboBox renseignée n'aura plus qu'une liste d'un seul élément qui sera sa valeur. Je ne vois vraiment pas à quoi ça servirait de changer les listes des ComboBox dans lesquelles on a déjà fait un choix. Et comme dit plus haut, si vous voulez changer ce choix mais en tenant compte d'autres ComboBox renseignées entre temps, vous avez toujours la ressource de l'effacer: ça recalculera bien sa liste puisqu'elle ne sera plus renseignée.
 
Dernière édition:

Discussions similaires