XL 2016 Filtres multi-critères (chaine et couleur) sur bouton

OfficeNoob

XLDnaute Nouveau
Bonsoir le forum :)

Nouveau venu sur le forum je viens poser ce soir mon 1er problème :

Je travaille actuellement sur un planning d'intervention dans le cadre de mon travail, le fichier se compose de plusieurs onglet représentant des sites d'intervention
Sur chaque onglet se trouve un ou plusieurs tableaux représentant chacun une machine, chaque tableau peut lui-même contenir une ou plusieurs ligne représentant chacune une intervention sur la machine.

Sur la partie gauche de chaque onglet se trouve une série de bouton servant à filtrer les tableaux selon l'état de l'intervention. Chaque bouton représente un filtre et les filtres se font soit selon la valeur contenu dans la cellule (pour les interventions en cours, validées, etc), soit selon la couleur de la police (pour les interventions de la semaine, et celles dont la date est dépassée).

Actuellement j'arrive bien à faire les filtres selon un seul critère mais mon but c'est que l'utilisateur puissent sélectionnée plusieurs boutons à la suite et ainsi appliquer plusieurs filtres sur les tableaux.

Du coup, enfin, ma question est : comment appliqué plusieurs filtres sur mes tableaux avec des critères différent, en sachant que l'utilisateur peut sélectionner 1, 2 ou 5 filtres.

Je met en PJ mon fichier (c'est mon 1er projet, soyez indulgent sur la qualité du code)
Le code pour les filtres se trouve dans le dossier Modules ==> Procedures_communes_classeur

Je remercie d'avance tout ceux qui se pencheront sur mon cas :)
 

Pièces jointes

  • Fichier_planning intervention.xlsm
    218 KB · Affichages: 16
Solution
Bonsoir le forum,

Après maintes recherche j'ai finalement réussi à résoudre mon problème, à savoir je dispose dans mon fichier de plusieurs Shape lançant chacune un filtre sur un critère, l'idée était de pouvoir appuyer sur plusieurs boutons et ainsi accumuler les filtres, le soucis c'est que j'utilisai tantôt un critère couleur et tantôt un critère valeur. Ma 1ère piste était de tous filtrer selon le critère couleur mais apparemment Excel ne permet pas de filtrer selon plusieurs couleurs.

La solution était finalement de créé une colonne supplémentaire dans mes tableaux, colonne qui sera utilisé pour récupérer le code couleur de la colonne qui va être filtrer.
A partir de la j'ai facilement pu mettre en place un code qui va filtrer...

OfficeNoob

XLDnaute Nouveau
Bonsoir Jean-marie, d'abord merci pour ta réponse.

Effectivement c'est une bonne remarque, en fait il y'a de fortes chances qu'a l'utilisation d'autres filtres viennent se greffer à ceux existant, j'ai déjà donnée une ébauche à un collègue qui m'a conseillé de permettre le multi filtre. Il peut être plaisant de pouvoir filtrer en même temps les actions en cours et les actions à traiter par exemple.
Et j'avoue que j'aime bien me mettre de petits challenge, même si pour le coup mes petites connaissance ne me permettent pas d'aborder le problème.

Christophe
 

OfficeNoob

XLDnaute Nouveau
Bonsoir le forum,

Après maintes recherche j'ai finalement réussi à résoudre mon problème, à savoir je dispose dans mon fichier de plusieurs Shape lançant chacune un filtre sur un critère, l'idée était de pouvoir appuyer sur plusieurs boutons et ainsi accumuler les filtres, le soucis c'est que j'utilisai tantôt un critère couleur et tantôt un critère valeur. Ma 1ère piste était de tous filtrer selon le critère couleur mais apparemment Excel ne permet pas de filtrer selon plusieurs couleurs.

La solution était finalement de créé une colonne supplémentaire dans mes tableaux, colonne qui sera utilisé pour récupérer le code couleur de la colonne qui va être filtrer.
A partir de la j'ai facilement pu mettre en place un code qui va filtrer selon plusieurs valeur.

Je poste ici le code que j'ai utilisé.



La fonction trouvé sur le net permettant de récupérer la couleur d'une cellule (couleur changer par MFC) :

VB:
' /// Fonction utilisée pour traiter CouleurCellule via la fonction evaluate afin
' /// de pouvoir récupérer la couleur de la cellule cible qui, elle, est modifié via MFC

Public Function Couleur(cellule As Range)

        Application.Volatile
        Couleur = Evaluate("CouleurCellule(""" & cellule.Address & """,""" & cellule.Worksheet.Name & """)")

End Function





' /// Fonction utilisée pour récupérer le code couleur de la cellule cible

Private Function CouleurCellule(cellule As String, feuille As String)

        CouleurCellule = Sheets(feuille).Range(cellule).DisplayFormat.Font.Color

End Function


La procédure permettant de traiter tous cela :

VB:
' /// Procédure commune et privée à ce module, utilisée pour filtrer tous les tableaux présent sur l'onglet actuel
' /// Les arguments sont le nom et le numéro de la forme ainsi que les paramètres du filtre

Private Sub Traitement_commun_switch_couleur_shp(ByVal nomShp As String, ByVal numShp As Integer, ByVal numField As Integer)

        Dim nbrTab As Integer
        Dim index As Integer
        Dim index_ As Integer
        Dim nbrIndex As Integer
        Dim tabActuel As Integer
        Dim tabFiltreSV() As String
       
        ' Comptage des tableaux présent sur l'onglet
        nbrTab = ActiveSheet.ListObjects.Count
       
        Application.ScreenUpdating = False
       
        ' On rentre dans la condition si le nombre de tableau est supérieur à 0
        If nbrTab > 0 Then
       
                If ActiveSheet.Shapes.Range(Array(nomShp)).Fill.ForeColor.RGB = RGB(255, 255, 255) Then
               
                        tabFiltreCouleur(numShp - 1) = ActiveSheet.Shapes.Range(Array(nomShp)).Line.ForeColor
                        indexTabFiltreCouleur = indexTabFiltreCouleur + 1
                       
                        ' Appel de la procédure pour le switch de couleur de la forme
                        Call Sub_switch_couleur_shp.Switch_couleur_forme_feuille_calcul(numShp, True)
               
                Else
               
                        tabFiltreCouleur(numShp - 1) = ""
                        indexTabFiltreCouleur = indexTabFiltreCouleur - 1
                       
                        ' Appel de la procédure pour réinitialiser la couleur de la forme
                        Call Sub_switch_couleur_shp.Switch_couleur_forme_feuille_calcul(numShp, False)
               
                End If
               
                nbrIndex = Func_calcul.Calcul_nombre_index_non_vide_tab(6, tabFiltreCouleur())
                ReDim tabFiltreSV(nbrIndex)
               
                ' On transfère le contenu du tableau tabFiltreCouleur dans le tabFiltreSV en excluant les lignes vides
                index_ = 0

                For index = 0 To 6

                        If Not tabFiltreCouleur(index) = "" Then
                                tabFiltreSV(index_) = tabFiltreCouleur(index)
                                index_ = index_ + 1
                        End If

                Next index

                ' Boucle sur les tableaux de l'onglet afin de les filtrer selon les critères passés en arguments
                For tabActuel = 1 To nbrTab
                        ActiveSheet.ListObjects(tabActuel).Range.AutoFilter Field:=numField, Criteria1:=tabFiltreSV(), Operator:=xlFilterValues
                Next tabActuel
               
                ' Si nbrIndex est égal à 0, donc aucun bouton filtre n'est actif, on réinitialise les filtres sur les tableaux
                If nbrIndex = 0 Then
               
                        For tabActuel = 1 To nbrTab
                                ActiveSheet.ListObjects(tabActuel).Range.AutoFilter
                        Next tabActuel

                        indexTabFiltreCouleur = 0
               
                End If
       
        End If
       
        Application.ScreenUpdating = True

End Sub



Sans filltre :


Capture.PNG




Avec filtre :

Capture1.PNG





Voila en espérant que ca pourra aider quelqu'un dans le même cas de figure.
 

Discussions similaires

Réponses
1
Affichages
226

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh