IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Désactiver un filtre s'il existe (solution fiable et eprouvée) ? [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut Désactiver un filtre s'il existe (solution fiable et eprouvée) ?
    Bonjour,

    Il y a de nombreux posts sur l'activation/desactivation du filtre automatique.

    Cependant la séquence que j'utilise ne semble pas fonctionner.
    En effet en fin de procédure aléatoirement, lorsque la macro me rend la main, le filtre est toujours actif.

    Pouvez vous me conseiller une procédure plus fiable et si possible éprouvée.
    Précision qui a peut-etre son importance : les données sont dans un tableau structuré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ' on enlève les filtres de la feuille FNC
        Sheets("FNC").Activate
    If ThisWorkbook.Worksheets("FNC").FilterMode = True Then ThisWorkbook.Worksheets("FNC").ShowAllData
    merci
    Denis

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 041
    Par défaut
    Bonjour.
    De mémoire, pour que la fonction FilterMode fonctionne il faut impérativement que la cellule active soit une cellule visible du tableau.
    A vérifier dans votre cas.

    Pour information, voici comment je procède (ça peut vous donner des idées):

    Je mémorise le tableau structuré dans une variable (par exemple TD)
    Je me place sur la première ligne de ce tableau car pour savoir si le tableau contient un filtre avec la fonction ActiveSheet.FilterMode il faut impérativement que la cellule active soit une cellule visible du tableau.
    S'il y a un filtre je mémorise les conditions du filtre, puis j'efface le filtre.
    je fais mes traitements.
    S'il y avait un filtre je le restaure avec ses conditions.

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    ' Mémorise le tableau structuré "MonTableau" de la feuille "Feuil1":
    Dim TD As Range
    Set TD = Sheets("Feui1").Range("MonTableau")
     
    ' La cellule active doit être une cellule visible du tableau
    ' pour que la fonction ActiveSheet.FilterMode puisse fonctionner:
     Cells(TD.Row - 1, TD.Column).Select
     
    ' Si le filtre automatique n'existe pas cela renvoie une erreur:
    Dim Filtre As Boolean
    Filtre = ActiveSheet.FilterMode
     
    ' Si au moins un filtre est actif alors mémoriser tous les filtres et les vider:
    If Filtre = True Then
        Filters_Memorize
        TD.AutoFilter
    End If
     
    ' Mes traitements sont ici ...
     
    ' Restaure les filtres:
    If Filtre = True Then
        TD.AutoFilter
        Filters_Restore
    End If
     
    '------------------------------------------------------------------------------------------------------


    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Dim FilterArray()
     
    '-----------------------------------------------------------------------------------------------
    Sub Filters_Memorize()
    '-----------------------------------------------------------------------------------------------
    ' Mémorise les filtres de la feuille active.
    '-----------------------------------------------------------------------------------------------
    Dim f As Integer
     
    With ActiveSheet.AutoFilter.Filters
        ReDim FilterArray(1 To .Count, 1 To 3)
        For f = 1 To .Count
            With .Item(f)
                If .On Then
                    FilterArray(f, 1) = .Criteria1
                    If .Operator Then
                        FilterArray(f, 2) = .Operator
                        FilterArray(f, 3) = .Criteria2
                    End If
                End If
            End With
        Next
    End With
     
    End Sub
     
    '-----------------------------------------------------------------------------------------------
    Sub Filters_Restore()
    '-----------------------------------------------------------------------------------------------
    ' Restore les filtres de la feuille active préalablement mémorisés.
    '-----------------------------------------------------------------------------------------------
    Dim f As Integer
     
    For f = 1 To UBound(FilterArray(), 1)
        If Not IsEmpty(FilterArray(f, 1)) Then
            If FilterArray(f, 2) Then
                ActiveSheet.Range(ActiveSheet.AutoFilter.Range.Address).AutoFilter Field:=f, _
                    Criteria1:=FilterArray(f, 1), _
                    Operator:=FilterArray(f, 2), _
                    Criteria2:=FilterArray(f, 3)
            Else
                ActiveSheet.Range(ActiveSheet.AutoFilter.Range.Address).AutoFilter Field:=f, Criteria1:=FilterArray(f, 1)
            End If
        End If
    Next
    End Sub
    '-----------------------------------------------------------------------------------------------

    Cordialement.

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Merci Laurent,

    je crois bien que la formule magique réside dans ton explication
    De mémoire, pour que la fonction FilterMode fonctionne il faut impérativement que la cellule active soit une cellule visible du tableau.
    En effet depuis que je m'assure que je suis positionné sur la ligne d'entête avant d'enlever le filtre cela semble fonctionner !

    Merci pour cette évidence, que je n'avais point vue sur les posts sur le sujet, sûrement que c'est trop évident !

    Denis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Code VBA pour désactiver plusieurs filtres en même temps
    Par filsdepub dans le forum Excel
    Réponses: 4
    Dernier message: 23/10/2015, 12h56
  2. [Toutes versions] Désactiver un filtre
    Par azur123 dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/08/2012, 10h23
  3. Problème Filtre controlant l'existance d'une session
    Par scandinave dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 30/03/2012, 19h27
  4. [eZ Publish] Désactiver le filtre anti-spam des e-mails
    Par ricozor dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 20/03/2009, 20h34
  5. excel VBA et désactivation du filtre
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/10/2006, 18h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo