Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Tester l'existence d'un filtre dans un tableau structuré

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
Je cherche à tester l'existence d'un filtre dans un tableau structuré.
Mon objectif : s'il n'y a pas de filtres, en ajouter un. Et s'il y en a déjà un, s'assurer qu'aucun filtre n'est actif (sans les désactiver !)
Pouvez-vous m'aider dans la rédaction de la syntaxe SVP ?
J'ai commencé comme ça :

Sub testFiltre()
Dim monTab As ListObject
Set monTab = Feuil1.ListObjects("Tableau_Struct")
If monTab.AutoFilter Then 'Là, ça bugue
monTab.Range.AutoFilter 'Pas testé puisque je n'arrive pas à corriger la ligne ci-dessus
Else
monTab.AutoFilter.ShowAllData
End If
End Sub

Merci d'avance pour vos suggestions !
 

vgendron

XLDnaute Barbatruc
En cherchant un peu
ca donne ca
VB:
Sub testFiltre()
Dim monTab As ListObject
Set monTab = Feuil1.ListObjects("Tableau_Struct")

On Error Resume Next
    If monTab.AutoFilter.FilterMode Then
        monTab.Range.AutoFilter
    End If
    monTab.ShowAutoFilterDropDown = True
    If monTab.AutoFilter.FilterMode Then
        monTab.Range.AutoFilter
    Else
        monTab.AutoFilter.ShowAllData
    End If
End Sub
 

BenHarber

XLDnaute Occasionnel
@vgendron ,
1000 mercis pour ton aide, ça fonctionne !
En plus de méconnaître la fonction "ShowAutoFilterDropDown", je n'aurais jamais pensé à utiliser "On Error Resume Next" (dont j'ai souvent entendu dire qu'il fallait se méfier...mais je suppose que quand on maîtrise bien le VBA -comme les cadors de ce site-, ça passe crème).
Encore merci ! BH
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @BenHarber ,
Bonjour @vgendron ,

A l'occasion de cette question, je pense qu'il y a malgré tout quelques problèmes avec les TS et Excel.

Prenons le cas d'une feuille de calcul avec un tableau structuré et une plage ordinaire. Le TS et la plage sont disjoints mais possèdent des lignes de la feuille de calcul en commun.

On peut, sans qu'Excel ne bronche aucunement, filtrer le TS (via le menu Création de tableau puis cocher 'Bouton de filtre) et aussi filtrer la plage (via le menu Données puis Filtrer).

On se retrouve donc avec deux zones disjointes (TS et Plage) filtrant les lignes de la même feuille de calcul. Ce qui, a mon sens, ne peut aboutir qu'à des absurdités si le TS et la plage ont des lignes en commun.

A mon humble avis, Excel devrait refuser d'avoir deux zones distinctes avec filtre. Car même si le TS et la plage n'ont aucune ligne en commun, la vie de la feuille de calcul n'empêcherait pas la croissance des zones (ou leur déplacement) jusqu'à aboutir à des lignes en commun.

Qu'en pensez-vous. Merdoie-je ?
 

Pièces jointes

  • Filtre auto et TS.gif
    622.1 KB · Affichages: 6
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Je ne comprends pas bien, un TS (Tableau Structuré) est d'office avec un filtrage actif
Je ne sais pas ce que tu veux dire par "d'office", mais lors de la création d'un TS, le filtrage est activé mais sans filtre actif, et rien n'empêche de supprimer ledit filtrage.



Qu'en pensez-vous. Merdoie-je ?
Que nenni !
Il paraît effectivement anormal de pouvoir avoir des lignes communes sur deux plages filtrées.
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Pas tout lu mais perso j'utilise cette fonction.
VB:
'-----------------------------------------------------------------------
'Return = True si il y a des colonnes filtrées dans un tableau structuré
'-----------------------------------------------------------------------
Function ExisteColonnesFiltréesTableauStructuré(Tbl As ListObject) As Boolean   
    'Init Return Value
    ExisteColonnesFiltréesTableauStructuré = False

    With Tbl
        'Il n'y a pas de filtres
        If .AutoFilter Is Nothing Then Exit Function
  
        'Aucune colonne n'est filtrée
        If .AutoFilter.FilterMode = False Then Exit Function
      
        'Set Return Value
        ExisteColonnesFiltréesTableauStructuré = True
    End With
End Function
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Et si on veut savoir quelles colonnes sont filtrées...
Code:
'--------------------------------------------------
'Liste des colonnes filtrées d'un tableau structuré
'Return: False si aucun filtre sur colonne
'        Tableau des numéros de colonnes filtées
'--------------------------------------------------
Function TabColonnesFiltréesTableauStructuré(Tbl As ListObject) As Variant
    Dim TabColonnesFiltrées() As Integer
    Dim NbColonnesFiltrées As Integer
    Dim j As Integer

    'Init Return Value
    TabColonnesFiltréesTableauStructuré = False
  
    'Il n'y a pas de colonne filtrée dans le tableau structuré
    If Not ExisteColonnesFiltréesTableauStructuré(Tbl) Then Exit Function
  
    With Tbl
        For j = 1 To .ListColumns.Count
            'Filtre sur colonne j
            If .AutoFilter.Filters(j).On Then
                NbColonnesFiltrées = NbColonnesFiltrées + 1
                ReDim Preserve TabColonnesFiltrées(1 To NbColonnesFiltrées)
                TabColonnesFiltrées(NbColonnesFiltrées) = j
            End If
        Next j
    End With
  
    TabColonnesFiltréesTableauStructuré = TabColonnesFiltrées
End Function
 

BenHarber

XLDnaute Occasionnel
Bonjour @Dudu2
Merci beaucoup pour ton astuce .
Du coup, je pense que le code proposé en 1ère mouture par @vgendron peut être optimisé en écrivant :

Sub testFiltre()
Dim monTab As ListObject
Set monTab = Feuil1.ListObjects("Tableau_Struct")

If monTab.AutoFilter Is Nothing Then
monTab.Range.AutoFilter
Else
monTab.AutoFilter.ShowAllData
End If
End Sub

@vgendron es-tu d'accord avec cette proposition (ou ai-je loupé qqch) ?

Merci aussi à @mapomme et @TooFatBoy pour vos contributions !
BH
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…