web-dev-qa-db-fra.com

Macro Excel 2013 VBA Supprimer tous les filtres

Il semble que les anciennes macros ne fonctionnent pas. Securtiy est configuré pour exécuter les macros VBA, mais lorsque j'ai essayé quelques méthodes pour effacer TOUS les filtres d'une feuille de calcul, une erreur de compilation s'est produite.

Voici ce que j'ai essayé:

Sub AutoFilter_Remove()'This macro removes any filtering in order to display all of the data but it does not remove the filter arrowsActiveSheet.ShowAllDataEnd Sub

J'ai des boutons sur les feuilles pour effacer tous les filtres afin de faciliter l'utilisation par les utilisateurs, car les feuilles comportent beaucoup de colonnes sur lesquelles se trouvent des filtres.

35
CJSoldier

Si la feuille a déjà un filtre, alors:

Sub Macro1()
    Cells.AutoFilter
End Sub

va l'enlever.

30
Gary's Student

Essaye ça:

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData
51
CRondao

ShowAllData générera une erreur si aucun filtre n'est actuellement appliqué. Cela fonctionnera:

Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub
26
BobbyA

Pour les tables, essayez ceci pour vérifier s’il est allumé et éteignez:

If wrkSheetCodeName.ListObjects("TableName").ShowAutoFilter Then
    wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
End if

Pour rallumer:

wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
16
Aaron Donnelly

cela fonctionne bien.!

If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
8
saltorr

J'ai trouvé cette solution de contournement pour fonctionner assez efficacement. Il supprime fondamentalement l'autofilter de la table puis le réapplique, supprimant ainsi les filtres précédents. De par mon expérience, cela n’est pas sujet au traitement d’erreur requis avec les autres méthodes mentionnées ici.

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True
5
Julius Getz Mørk

C’est brillant, la seule réponse que j’ai trouvée qui répondait à mon besoin particulier, merci SO merci beaucoup de l’avoir mise en place!

Je n'y ai ajouté qu'un ajout mineur afin que l'écran ne clignote pas et qu'il supprime puis réapplique le mot de passe de chaque feuille au fur et à mesure qu'il passe en revue [j'ai le même mot de passe pour toutes les feuilles du classeur]. Dans l'esprit de votre mémoire, j'ajoute ceci pour aider quelqu'un d'autre ...

Sub ClearFilters()
    Application.ScreenUpdating = False

    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        'Change the password to whatever is required
        wrksheet.Unprotect Password:="Albuterol1"
        wrksheet.ShowAllData 'This works for filtered data not in a table

        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If

        'Change the password to whatever is required
        wrksheet.Protect Password:="Albuterol1", _
              DrawingObjects:=True, _
              Contents:=True, _
              Scenarios:=True, _
              AllowFiltering:=True
        Next 'Check next worksheet in the workbook
    Next

    Application.ScreenUpdating = True
End Sub

Je sais que c'est un article relativement ancien et je n'aime pas vraiment être un nécromancien ... Mais comme j'avais le même problème et que j'avais essayé quelques-unes des options de ce fil sans succès, j'ai combiné certaines des réponses pour obtenir une macro fonctionnelle. .. 

Espérons que cela aide quelqu'un là-bas :)

Sub ResetFilters()
    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        wrksheet.ShowAllData 'This works for filtered data not in a table
        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If
        Next 'Check next worksheet in the workbook
    Next
End Sub
4
Shadmage

J'utilise habituellement ce code

Sub AutoFilter_Remove()
    Sheet1.AutoFilterMode = False  'Change Sheet1 to the relevant sheet
                                   'Alternatively: Worksheets("[Your Sheet Name]").AutoFilterMode = False
End Sub

Cela fonctionnera aussi:

If ActiveSheet.FilterMode Then
cells.AutoFilter
End If
3
Linga

Il existe deux types de filtres dans Excel:

  • Filtre automatique
  • Filtre avancé

La fonctionnalité de filtrage automatique vous permet de filtrer à partir de l'interface Excel à l'aide de ces minuscules boutons déroulants. Et la fonctionnalité de filtre avancé vous permet de filtrer en utilisant une plage de critères.

La méthode ShowAll supprime les filtres car, comme dans, affiche toutes les lignes, mais ne supprime pas ces boutons Drop Down. Vous devez définir la propriété AutoFilterMode de la feuille de calcul sur FALSE pour supprimer ces boutons.

Voici un sous-fichier que j'utilise fréquemment pour supprimer les filtres:

Sub RemoveFilters(ByRef WhichSheet As Worksheet)

If WhichSheet.FilterMode Then WhichSheet.ShowAllData
If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False

End Sub

Cela affiche toutes les données et supprime les boutons déroulants. Il est pratique pour empiler (copier et coller) des données de plusieurs feuilles ou classeurs. J'espère que cela t'aides.

2
Ejaz Ahmed

Cela vérifiera d'abord si AutoFilterMode est défini (le filtrage est possible), puis si FilterMode est activé (vous filtrez sur quelque chose), puis désactivez le filtrage.

Concernant les erreurs, c’est-à-dire la protection - voir d’autres réponses

Ajout du contexte (mon script passe en boucle sur des feuilles, qui sont ensuite enregistrées au format CSV, d'où la nécessité de supprimer les filtres - mais laissez AutoFilterMode activé, si défini:

For Each WS In ActiveWorkbook.Worksheets
  Select Case WS.Name
    Case "01", "02", "03", "04", "05"
      With WS
        If WS.AutoFilterMode Then
            If WS.FilterMode Then WS.ShowAllData
        End If

        ' Processing data
      End With
    Case Else
      ' Nothing to see here
  End Select
Next
2
sastorsl

Essayez quelque chose comme ça:

Sub ClearDataFilters()
'Clears filters on the activesheet. Will not clear filters if the sheet is protected.
On Error GoTo Protection
If ActiveWorkbook.ActiveSheet.FilterMode Or _
   ActiveWorkbook.ActiveSheet.AutoFilterMode Then _
   ActiveWorkbook.ActiveSheet.ShowAllData

Exit Sub
Protection:
If Err.Number = 1004 And Err.Description = _ 
    "ShowAllData method of Worksheet class failed" Then
    MsgBox "Unable to Clear Filters. This could be due to protection on the sheet.", _
    vbInformation
End If

End Sub

.FilterMode renvoie true si la feuille de calcul est en mode filtre. ( Voir ceci pour plus d'informations.)
Voir ceci pour plus d’informations sur .AutoFilter.
Et enfin, this fournira plus d’informations sur la méthode .ShowAllData.

1
ARich

Voici le one-liner que j'utilise. Il recherche un filtre automatique et, s'il est trouvé, le supprime.

Contrairement à certaines réponses, ce code ne créera pas de filtre automatique s'il est utilisé dans une feuille de calcul qui n'est pas filtrée automatiquement.

If Cells.AutoFilter Then Cells.AutoFilter
1
ChrisB

Voici du code pour la fixation des filtres. Par exemple, si vous activez des filtres dans votre feuille, vous ajoutez une colonne et vous souhaitez que la nouvelle colonne soit également couverte par un filtre.

Private Sub AddOrFixFilters()

    ActiveSheet.UsedRange.Select

    ' turn off filters if on, which forces a reset in case some columns weren't covered by the filter
    If ActiveSheet.AutoFilterMode Then
        Selection.AutoFilter
    End If

    ' turn filters back on, auto-calculating the new columns to filter
    Selection.AutoFilter

End Sub
0
AdmiralAdama

Activez simplement les en-têtes de filtre et exécutez showalldata, fonctionne à 100%. Quelque chose comme:

Range("A1:Z1").Activate
ActiveSheet.ShowAllData

Range("R1:Y1").Activate
ActiveSheet.ShowAllData

Si vous avez les en-têtes de champ dans A1: Z1 et R1: Y1 respectivement.

0
JDuarteDJ

Essaye ça: 

Sub ResetFilters()
    Dim ws                    As Worksheet
    Dim wb                    As Workbook
    Dim listObj               As ListObject

    For Each ws In ActiveWorkbook.Worksheets
        For Each listObj In ws.ListObjects
            If listObj.ShowHeaders Then
                listObj.AutoFilter.ShowAllData
                listObj.Sort.SortFields.Clear
            End If
        Next listObj
    Next ws
End Sub

Ce code efface tous les filtres et supprime le tri.

Source: Suppression de filtres pour chaque table d'un classeur, VBA

0
Markus Hanisch

Tout ce dont tu as besoin c'est:

    ActiveSheet.AutoFilter.ShowAllData

Pourquoi? Comme la feuille de calcul, AutoFilter a également une méthode ShowAllData, mais il ne génère pas d'erreur, même lorsque le filtre automatique est activé sans filtre actif.

0
John Joseph

Cela ne sera effacé que si vous avez un filtre et ne provoque aucune erreur en l'absence de filtre . Si ActiveSheet.AutoFilterMode Puis ActiveSheet.Columns ("A"). AutoFilter

0
ganga chamlagai

Cela fonctionne mieux pour moi. 

J'utilise habituellement ce qui suit avant de sauvegarder et de fermer les fichiers.

Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub
0
Rahul Takalikar

J'utilise .filtermode si le filtre est activé, il renvoie true

Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If
0
Kesko

Ce fil est ancien, mais je n’étais satisfait d’aucune des réponses données et j’ai fini par écrire le mien. Je le partage maintenant:

Nous commençons par:

  Sub ResetWSFilters(ws as worksheet)
             If ws.FilterMode Then   
     ws.ShowAllData   
     Else   
     End If  
    'This gets rid of "normal" filters - but tables will remain filtered
    For Each listObj In ws.ListObjects 
               If listObj.ShowHeaders Then   
                    listObj.AutoFilter.ShowAllData
                    listObj.Sort.SortFields.Clear    
               End If     
       Next listObj
        'And this gets rid of table filters
        End Sub

Nous pouvons ajouter une feuille de calcul spécifique à cette macro qui ne filtrera que cette feuille de calcul. Utile si vous devez vous assurer qu'une seule feuille de travail est claire. Cependant, je veux généralement faire le cahier entier

Sub ResetAllWBFilters(wb as workbook)
  Dim ws As Worksheet  
  Dim wb As Workbook  
  Dim listObj As ListObject    

       For Each ws In wb.Worksheets  
          If ws.FilterMode Then 
          ws.ShowAllData  
          Else   
          End If   
 'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
   For Each listObj In ws.ListObjects 
        If listObj.ShowHeaders Then   
             listObj.AutoFilter.ShowAllData 
             listObj.Sort.SortFields.Clear    
        End If     
   Next listObj

        Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub

Vous pouvez utiliser ceci, par exemple, en ouvrant un classeur que vous devez gérer et en réinitialisant leurs filtres avant d’utiliser quoi que ce soit:

Sub ExampleOpen()
Set TestingWorkBook = Workbooks.Open("C:\Intel\......") 'The .open is assuming you need to open the workbook in question - different procedure if it's already open
Call ResetAllWBFilters(TestingWorkBook)
End Sub

Celui que j'utilise le plus: Réinitialisation de tous les filtres du classeur dans lequel le module est stocké:

Sub ResetFilters()
      Dim ws As Worksheet  
      Dim wb As Workbook  
      Dim listObj As ListObject  
       Set wb = ThisWorkbook  
       'Set wb = ActiveWorkbook
       'This is if you place the macro in your personal wb to be able to reset the filters on any wb you're currently working on. Remove the set wb = thisworkbook if that's what you need
           For Each ws In wb.Worksheets  
              If ws.FilterMode Then 
              ws.ShowAllData  
              Else   
              End If   
     'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
       For Each listObj In ws.ListObjects 
            If listObj.ShowHeaders Then   
                 listObj.AutoFilter.ShowAllData 
                 listObj.Sort.SortFields.Clear    
            End If     
       Next listObj

            Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub
0
Selkie