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 :

Vérifier si un tableau (ou une range) est filtrée [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut Vérifier si un tableau (ou une range) est filtrée
    Bonjour,

    Je me prends la tête depuis 1h sur un sujet tout simple et dont la résolution va être très rapide... je l'imagine...

    Je veux tout simplement savoir si mon tableau est filtré en VBA...
    Je pense qu'il doit me manquer un argument et je suis surement passé à côté sur les nombreux topics que j'ai écumé...

    J'ai à peu près tout testé entre les .AutoFilterMode, .FilterMode et .AutoFilter.

    En voici quelques uns :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    With Worksheets(FEUIL_ORI)
        Debug.Print .Range(TAB_REF & "[#Headers]").Address '=> $A$1:$J$1
        Debug.Print .Range(TAB_REF).Address '=> $A$2:$J$153
     
        Debug.Print .AutoFilterMode '=> Faux tout le temps
        Debug.Print .Range(TAB_REF & "[#Headers]").AutoFilter '=> Vrai tout le temps (et m'insère mes filtres sur la plage ou les enlève en fonction de l'état initial)
     
        'Debug.Print .Range(TAB_REF & "[#Headers]").AutoFilterMode '=> Méthode non gérée
        'Debug.Print .Range(TAB_REF).AutoFilterMode '=> Méthode non gérée
     
        'Debug.Print .Range(TAB_REF).FilterMode '=> Méthode non gérée
    End With
    Voila ! Si vous avez la propriété magique, je suis preneur !

    Merci par avance pour votre aide.

    Je reste à votre disposition pour tout complément.

    Cordialement,
    Kimy

    PS : Pour précision, aucun problème pour savoir si une feuille est filtrée => je parle bien d'un tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Worksheets(FEUILLE)
        If .AutoFilterMode Then 'sur la feuille entière
            .Cells.AutoFilter
        End If
    End With

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 568
    Par défaut
    Bonjour

    Si sur un onglet on n'a pas de tableau ou un seul tableau ce n'est pas pareil que si on a plusieurs tableaux...

    Voir ce fil où je donnais les subtilités

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Chris,

    Je n'ai qu'un tableau sur ma feuille.
    Par ailleurs, sauf erreur de ma part, le lien du fil n'est pas placé dans ton post.

    En te remerciant par avance pour ton retour.
    Cordialement,
    Kimy

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 568
    Par défaut
    RE

    Oups ! je remet le code qui teste et défiltre... Noms de la feuille et du tableau à adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Lst As ListObject
     
    Set Lst = ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tableau1")
      If Lst.AutoFilter.FilterMode Then
        Lst.AutoFilter.ShowAllData
      End If

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Re Chris,

    J'avais testé aussi ce bout de code.
    J'ai revérifié... même erreur.

    Si mon tableau n'est pas filtré je tombe sur un "Variable objet non défini"...

    Je pourrais exporter ça dans une fonction indépendante et faire un On Error Resume Next, mais je n'aime pas trop ce genre de gestion d'erreur.
    Pour autant, avec mes recherches et ce que tu me proposes, j'ai l'impression que c'est la seule solution...

    Merci par avance pour ton retour si tu as d'autres infos.

    Cordialement,
    Kimy

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Autofilter étant un objet représentant l'ensemble des filtres de la plage, on peut utiliser une variable objet pour le stocker

    s'il est vide, c'est qu'il n'y a pas de filtre
    s'il n'est pas vide, on peut ensuite tester si au moins un filtre est actif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub ioi()
    Const Message_Resultat As String = "La plage est : "
    Dim Retour As String
     
    Dim LeFiltrage As AutoFilter
    Set LeFiltrage = ActiveSheet.ListObjects(1).AutoFilter
        If Not LeFiltrage Is Nothing Then
            If LeFiltrage.FilterMode Then Retour = "filtrée avec filtre actif" Else Retour = "filtrée sans filtre actif"
        Else
            Retour = "non filtrée"
        End If
     
    MsgBox Message_Resultat & Retour
    End Sub

    Si on souhaite "simplement" savoir si la plage est en mode "filtre automatique", simplification et simplicité pour créer une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ououou()
        MsgBox "Mode Filtre Automatique : " & ActiveSheet.ListObjects(1).ShowAutoFilter
    End Sub

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Et sans passer par une variable objet, pour ma proposition 1 ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ioi()
    Const Message_Resultat As String = "La plage est : "
    Dim Retour As String
        With ActiveSheet.ListObjects(1)
            If Not .AutoFilter Is Nothing Then
                If .AutoFilter.FilterMode Then Retour = "filtrée avec filtre actif" Else Retour = "filtrée sans filtre actif"
            Else
                Retour = "non filtrée"
            End If
        End With
    MsgBox Message_Resultat & Retour
    End Sub


    EDIT :

    et pour utiliser sous forme de fonction ?

    Code : 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
    Sub ououou()
        MsgBox FiltresActifLs(ActiveSheet.ListObjects(1))
    End Sub
     
     
    Function ModeFiltrageAutoLs(LS As ListObject) As Boolean
    ' défini si le ListObject est en mode filtre automatiques
        ModeFiltrageAutoLs = Not LS.AutoFilter Is Nothing
    End Function
     
     
    Function FiltresActifLs(LS As ListObject) As Boolean
    ' défini si au moins un filtre est activée sur une plage disposant d'un filtre automatique
        If Not ModeFiltrageAutoLs(LS) Then Exit Function
        FiltresActifLs = LS.AutoFilter.FilterMode
    End Function

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

Discussions similaires

  1. Vérifier si le schéma d'une BDD est en 3e forme normale
    Par Tmutantv1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/05/2012, 11h47
  2. Réponses: 10
    Dernier message: 20/11/2011, 18h19
  3. Réponses: 5
    Dernier message: 20/08/2010, 10h01
  4. Réponses: 1
    Dernier message: 12/06/2009, 23h02
  5. Réponses: 4
    Dernier message: 09/03/2006, 09h50

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