FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 14 octobre 2009 

 
OuvrirSommaireLes filtres

Un filtre automatique permet de masquer les lignes d'une plage de cellules ne répondant pas aux critères spécifiés. Les critères sont définis pour chaque colonne. Il ne peut y avoir qu'un seul filtre automatique dans une feuille (Dans Excel2007, vous pouvez transformer les plages d'une même feuille en tableau afin d'utiliser plusieurs filtres sur la page). Le filtre automatique s'applique à une plage de cellules dont la première ligne contient les entêtes (champs).

Pour créer un filtre automatique, utilisez la méthode AutoFilter:

Vba
Sélectionnez

Range("A1").AutoFilter 



Toutes les cellules voisines à A1 vont être intégrées dans le filtre.


Si le filtre automatique existait déjà, celui-ci sera désactivé. Pour préalablement vérifier la présence du filtre, utilisez AutoFilterMode qui renvoie True si le filtre existe:

Vba
Sélectionnez

With Worksheets("Feuil1")
    If Not .AutoFilterMode Then .Range("A1").AutoFilter
End With




Chaque champ (colonne) peut recevoir les critères de filtre que vous aurez paramétré : Vous disposez de critères de condition (Criteria1 et Criteria2) pour indiquer les données à vérifier et des opérateurs (xlAnd, xlOr) pour combiner ces conditions. L'argument Field correspond au numéro de colonne dans la plage du filtre automatique.

Vba
Sélectionnez

Range("A1").AutoFilter Field:=1, Criteria1:="Ville01"
Vba
Sélectionnez

Range("A1").AutoFilter Field:=1, Criteria1:="Ville01", Operator:=xlOr, Criteria2:="Ville02"
Vba
Sélectionnez

'Les Opérateurs de comparaison: ", <, >=, <>"
'
'Utilisez le point à la place de la virgule pour définir les valeurs décimales.
'
Range("A1").AutoFilter Field:=2, Criteria1:="<>19.6"
Vba
Sélectionnez

'Utilisez le signe générique astérisque (*) pour indiquer que le critère 'contient'.
'(le filtre est insensible à la casse)
Range("A1").AutoFilter Field:=1, Criteria1:="*dvp*"




Pour enlever tous les filtres actifs, utilisez:

Vba
Sélectionnez

With Worksheets("Feuil1")
    If .FilterMode = True Then .ShowAllData
End With




Pour supprimer le filtre automatique:

Vba
Sélectionnez

Worksheets("Feuil1").AutoFilterMode = False
Créé le 20 août 2007  par SilkyRoad
Vba
Sélectionnez

Sub AppliqueCouleur_ColonneFiltree()
Dim x As Integer
Dim Ws As Worksheet
 
Set Ws = Worksheets("Feuil1")
 
With Ws
    'Enlève les couleurs initiales
    .Cells.Interior.ColorIndex = xlNone
    'Vérifie si la feuille est en mode filtre automatique
    If .FilterMode = True Then
        'boucle sur les filtres de la feuille
        With .AutoFilter.Filters
            For x = 1 To .Count
                'Colorie la colonne en jaune si le filtre est actif
                If .Item(x).On Then Ws.Columns(x).Interior.ColorIndex = 6
            Next
        End With
    End If
End With
End Sub
Créé le 20 août 2007  par SilkyRoad

Dans cet exemple, le filtre automatique est dans la feuille nommée Feuil1.

Vba
Sélectionnez

Sub NommerZoneFiltree()
ActiveWorkbook.Names.Add Name:="NomPlage_01", _
    RefersTo:="=Feuil1!" & _
    Feuil1.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Address
End Sub
Créé le 14 mai 2007  par SilkyRoad

Dans Excel2007, l'application est capable d'analyser automatiquement les dates par jour, semaine, mois, semestre ou année ce qui facilite les filtres sur ce type de données.

Image non disponible


Pour désactiver cette option et dissocier cette hiérarchie (transformation en liste non hiérarchique):
     Cliquez sur le Bouton Office.
     Cliquez sur le bouton Options Excel.
     Sélectionnez le menu Options avancées.
     Dans la partie Afficher les options pour ce classeur,
     Choisissez le classeur.
     Décochez l'option Grouper les dates dans le menu Filtre automatique.
     Cliquez sur le bouton OK pour valider.

Créé le 20 août 2007  par SilkyRoad

Exemple pour un filtre placé dans la colonne A.
Formule à valider par Ctrl+Maj+Entrée.

Formule
Sélectionnez

=INDEX(A1:A100;MIN(SI(SOUS.TOTAL(3;DECALER(A2;LIGNE(A1:A100);));LIGNE(A3:A100)));1)
Créé le 20 août 2007  par SilkyRoad

Cet exemple additionne les cellules visibles de la colonne B.

Vba
Sélectionnez

MsgBox Application.WorksheetFunction.Subtotal(9, Columns(2))
Créé le 20 août 2007  par SilkyRoad

3 solutions:

Vba
Sélectionnez

MsgBox Range("A1:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Count



Vba
Sélectionnez

MsgBox Feuil1.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count



Vba
Sélectionnez

MsgBox Evaluate("=subtotal(3,A:A)")



Créé le 2 octobre 2007  par SilkyRoad

Pour filtrer les champs dont le contenu est vide, tapez dans la zone de critère

 
Sélectionnez

="="




Pour filtrer les enregistrements non vides: tapez

 
Sélectionnez

=""
Créé le 2 octobre 2007  par Lou Pitchoun

Il n'existe pas d'évènement spécifique pour identifier l'utilisation d'un filtre.
Pour contourner le problème, vous pouvez par exemple insérer la fonction suivante dans une cellule quelconque de la feuille:

 
Sélectionnez

=SOUS.TOTAL(3;A:A)



Et utilisez l'évènement Calculate dans le module objet de la feuille contenant le filtre.
La procédure sera déclenchée à chaque recalcul.

Vba
Sélectionnez

Private Sub Worksheet_Calculate()
    AppliqueCouleur_ColonneFiltree
End Sub
 
 
Sub AppliqueCouleur_ColonneFiltree()
Dim x As Integer
Dim Ws As Worksheet
 
Set Ws = Worksheets("Feuil1")
 
With Ws
    'Enlève les couleurs initiales
    .Cells.Interior.ColorIndex = xlNone
    'Vérifie si la feuille est en mode filtre automatique
    If .FilterMode = True Then
        'boucle sur les filtres de la feuille
        With .AutoFilter.Filters
            For x = 1 To .Count
                'Colorie la colonne en jaune si le filtre est actif
                If .Item(x).On Then Ws.Columns(x).Interior.ColorIndex = 6
            Next
        End With
    End If
End With
End Sub




Une autre solution proposée par Jacques Boisgontier: Appliquer une Mise en Forme Conditionnelle sur les en-têtes de filtre.
Sélectionnez les titres de champ dans la première ligne A1 à Ax
Menu Format
Mise en forme conditionnelle
Appliquez "La formule est" =ChampActif(A1)

Et dans un module standard ajoutez la fonction:

Vba
Sélectionnez

Function ChampActif(c)
  Application.Volatile
  ChampActif = Sheets(Application.Caller.Parent.Name).AutoFilter.Filters.Item _
  (c.Column - Sheets(Application.Caller.Parent.Name).Range("_FilterDataBase").Column + 1).On
End Function




Une troisième solution proposée par Tirex28:
Téléchargez le classeur démo qui contient un module de classe pour identifier l'utilisation du filtre dans la feuille de calcul.

Créé le 19 février 2008  par SilkyRoad, Emmanuel Tissot, jacques Boisgontier

Il n'est pas possible directement mais vous pouvez identifier l'affichage de toutes les données depuis l'évènement Calculate, et ensuite annuler la dernière opération grâce à la méthode Undo.


Procédure à ajouter dans le module objet de la feuille contenant le filtre:

Vba
Sélectionnez

Private Sub Worksheet_Calculate()
    If Evaluate("=subtotal(3,A:A)") = Range("A1").End(xlDown).Row Then _
        Application.Undo
End Sub
Créé le 26 mai 2008  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.