2011-02-24 12:22:53 +0000 2011-02-24 12:22:53 +0000
15
15

Comment rafraîchir automatiquement un filtre automatique Excel lorsque des données sont modifiées ?

Comment rafraîchir automatiquement un filtre automatique Excel lorsque des données sont modifiées ?

Cas d'utilisation : Je change la valeur d'une cellule pour une valeur qui a été filtrée. Je veux voir la ligne actuelle disparaître sans avoir à faire autre chose.

Réponses (7)

7
7
7
2012-08-09 15:31:24 +0000

Échanger le code avec ceci semble aussi faire l'affaire (au moins dans Excel 2010) :

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
```.
4
4
4
2012-11-06 18:12:51 +0000

J'ai constaté que lorsque je travaillais avec des tables, cela ne fonctionnait pas. Le filtre n'était pas sur la feuille mais sur la table. Ce code a fait l'affaire

Private Sub Worksheet_Change(ByVal Target As Range)
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
         .AutoFilter.ApplyFilter
    End With
End Sub

J'ai trouvé l'information ici : http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp

1
1
1
2017-06-10 10:08:26 +0000

J'utilise aussi un VBA/Macro basé sur l'événement Worksheet_Change mais mon approche est légèrement différente… Ok, d'abord le code et ensuite les explications :

Private Sub Worksheet_Change(ByVal Target As Range)
    ' first remove filter
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1        
    ' then apply it again
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub

(Utilisez la combinaison de touches Alt+F11 pour faire apparaître le panneau de développement et collez le code sur la feuille de travail contenant le filtre que vous voulez faire rafraîchir automatiquement).

Dans mon exemple, je suppose qu'il y a un filtre simple sur une seule colonne (L dans mon cas) et que ma plage de données se trouve sur des lignes allant de 1 (même si elle peut contenir un titre) à 126 (choisissez un nombre assez grand pour être sûr). L'opération est simple : lorsque quelque chose est modifié sur ma feuille, le filtre sur la plage spécifiée est enlevé/appliqué à nouveau afin de le rafraîchir. Ce qui a besoin d'un peu d'explication ici, ce sont Field et Criteria.

Le Field est un décalage entier de la plage. Dans mon cas, je n'ai qu'un filtre à une seule colonne et la plage est faite par une seule colonne (L) qui est la première de la plage (donc j'utilise 1 comme valeur).

Le Criteria est une chaîne qui décrit le filtre à appliquer à la plage de données. Dans mon exemple, je veux montrer uniquement les lignes où la colonne L diffère de 0 (c'est pourquoi j'ai utilisé “<>0”).

C'est tout. Pour plus de références sur la méthode Range.AutoFilter, voir : https://msdn.microsoft.com/en-us/library/office/ff193884.aspx

1
1
1
2011-02-27 15:19:59 +0000

Faites un clic droit sur le nom de votre feuille, choisissez “Afficher le code” et collez le code ci-dessous. Après avoir collé, cliquez sur l'icône Excel sous “Fichier” en haut à gauche, ou tapez Alt-F11, pour revenir à l'affichage de la feuille de calcul.

Cela activera le rafraîchissement automatique. N'oubliez pas d'enregistrer le fichier dans un format avec support de macro lie .xlsm.

Private Sub Worksheet_Change(ByVal Target As Range)

    If Me.FilterMode = True Then
        With Application
           .EnableEvents = False
           .ScreenUpdating = False
        End With

        With ActiveWorkbook
            .CustomViews.Add ViewName:="Mine", RowColSettings:=True
          Me.AutoFilterMode = False
            .CustomViews("Mine").Show
            .CustomViews("Mine").Delete
        End With

         With Application
           .EnableEvents = True
           .ScreenUpdating = True
        End With
    End If

End Sub
0
0
0
2016-12-16 14:59:00 +0000

Juste pour consolider la/les réponse(s) :

Sorin dit :

Cliquez à droite sur le nom de votre feuille, choisissez “View Code” et collez le code ci-dessous. Après avoir collé, cliquez sur l'icône Excel sous “File” en haut à gauche, ou tapez Alt-F11, pour revenir à la vue de la feuille de calcul.

Cela activera le rafraîchissement automatique. N'oubliez pas d'enregistrer le fichier dans un format supportant les macros lie .xlsm.

Et Chris a utilisé ce code (ce que je viens de faire en 2010) :

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Si vous ne développez pas le message, vous ne voyez que la réponse longue ! ;)

-1
-1
-1
2019-05-16 13:00:33 +0000
using "data, from table"/power query in excel, which gives us option to refresh data when opening file. (also auto sort, and index column (number filtered rows automatically )) This will create result in another sheet. -select data required using mouse (rows and columns) -click on data tab, from table -in the last column, exclude blanks (optional, if you want to to display only filled cells) -add column, index column (optional, if you want to add row number to filtered results) -close and load to to edit again, click on query tab, and then on edit click on design tab in excel, on the arrow below refresh, connection properties, refresh data when opening file. adapted from: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ part: 3. Sorting Drop Down Lists Using Power Query you can also copy data from sheet1 if not empty, for example field a1. copy this to a1 field in sheet2: =IF(Sheet1!A1"";Sheet1!A1;"")
-1
-1
-1
2017-08-27 20:47:46 +0000

Désolé, réponse insuffisante pour commenter. (Admins, n'hésitez pas à couper ceci dans un commentaire ci-dessus.) Réponse de l'utilisateur “danicotra” commençant par “J'utilise un VBA/Macro basé sur la feuille de travail_Changer aussi l'événement, mais mon approche…” avec ‘ enlever d'abord le filtre ’ puis l'appliquer à nouveau est la bonne solution quand on utilise Excel 2007+. Cependant, le filtre automatique “ApplyFilter” n'est pas valide dans XL03 et les versions antérieures, donc je vous montre le chemin ci-dessous.

Je supplie les vrais experts et les gourous de lire le code car je suis assez confiant qu'il s'agit d'un matériau de haut de gamme. Peut-être que le nombre inexplicable de votes négatifs sur cette réponse pourra être inversé quand les gens verront ce qui est bon en dessous.

danicotra a utilisé un exemple simplifié. En fait, vous pouvez faire cela de manière plus générale. Supposons avec ActiveSheet pour ce qui suit (ou un autre objet de la feuille) :

  1. Enregistrez la portée de l'autofiltre. Il y a des colonnes “AutoFilter.Filters.Count” et des lignes (“AutoFilter.Range.Count” / “AutoFilter.Filters.Count”), enregistrées dans rngAutofilter

  2. Rassemblez dans un tableau mesAutofiltres chacune des 4 propriétés de chacun des éléments de l'autofiltre .AutoFilter.Filters.Count, en veillant à éviter les “erreurs définies par l'application” lorsque .on ou .operator est faux. (mesAutofiltres seraient redimensionnés au nombre de lignes et de colonnes de l'étape 1)

  3. Désactivez le filtre mais conservez les listes déroulantes avec ShowAllData

  4. Pour chaque élément de filtre qui était activé selon votre tableau sauvegardé, réinitialisez 3 des 4 propriétés de chacun des éléments de l'autofiltre .AutoFilter.Filters.Count. Veillez à nouveau à éviter les “erreurs définies par l'application” lorsque l'opérateur est faux, c'est-à-dire que pour chaque élément “i”, rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i,2) ou rngAutofilter. AutoFilter Field:=i, Criteria1:=myAutofilters(i,2), Operator:=myAutofilters(i,3), Criteria2:=myAutofilters(i,4)

Maintenant l'autofiltre sera rétabli, sur la même plage qu'avant le début de votre code, mais avec l'autofiltre mis à jour pour les changements de données.

Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
  'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
  'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
  Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
  iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
  If iNumActiveAutofilters < 1 Then
      Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
      Exit Sub
  End If
  ActiveSheet.ShowAllData

  Rem Here optionally do stuff which can include changing data or toggling autofilter columns

  For i = 1 To iNumAutofilters
      If myAutofilters(i, 1) Then
          If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
          Else
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
          End If
          Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
      End If
      'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
  Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
  Dim i As Long, iRowsAutofiltered As Long
  SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
  iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
  If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
  ReDim myAutofilters(1 To iNumAutofilters, 4)
  For i = 1 To iNumAutofilters
      myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
      If myAutofilters(i, 1) Then
          SaveAutoFilterInfo = SaveAutoFilterInfo + 1
          myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
          myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
          If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
              myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
          End If
      End If
  Next i
  iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
  Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function

Questions connexes

10
6
13
9
10