Comment actualiser automatiquement un filtre automatique Excel lorsque les données sont modifiées?

15

Comment actualiser automatiquement un filtre automatique Excel lorsque les données sont modifiées?

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

Sorin
la source
3
J'ai pu le faire fonctionner lorsque j'ai mis ce code dans l'événement Worksheet_Change () au lieu de l'événement Worksheet_Calculate ().
F106dart
1
mettez cela comme réponse et acceptez-le, afin que les autres sachent ce que vous avez fait et que la question soit résolue.
jzd
J'ai dû faire une autre modification parce que Calculate attendait un paramètre. Maintenant ça marche!.
sorin

Réponses:

7

L'échange de code avec cela semble également faire l'affaire (au moins dans Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
la source
4

J'ai trouvé 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é les informations ici: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp

Plus de piratages
la source
1

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 à la feuille de calcul.

Cela permettra l'actualisation automatique. N'oubliez pas d'enregistrer le fichier dans un format avec prise en charge des macros .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
Sorin
la source
1

J'utilise également un VBA / Macro basé sur l' Worksheet_Changeévénement, mais mon approche est légèrement différente ... D'accord, d'abord le code puis 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+ F11pour faire apparaître le panneau de développement et collez le code dans la feuille de calcul contenant le filtre que vous souhaitez actualiser automatiquement.)

Dans mon exemple, je suppose avoir un simple filtre sur une seule colonne (L dans mon cas) et que ma plage de données est sur des lignes de 1 (même si elle peut contenir un en-tête) à 126 (choisissez un nombre suffisamment grand pour être sûr). L'opération est simple: à mesure que quelque chose change sur ma feuille, le filtre sur la plage spécifiée est à nouveau supprimé / réappliqué pour le rafraîchir. Ce qui nécessite un peu d'explication ici, ce sont les champs et les critères .

Le champ est un décalage entier de plage. Dans mon cas, je n'ai qu'un seul filtre de 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).

Les critères sont une chaîne qui décrit le filtre à appliquer à la plage de données. Dans mon exemple, je veux afficher uniquement les lignes où la colonne L diffère de 0 (j'ai donc utilisé "<> 0").

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

danicotra
la source
0

Juste pour consolider la ou les réponses:

Sorin dit:

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 à la feuille de calcul.

Cela permettra l'actualisation automatique. N'oubliez pas d'enregistrer le fichier dans un format avec prise en charge des macros lie .xlsm.

Et Chris a utilisé ce code (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 longue réponse! ;)

Type au hasard
la source
-1

Désolé, représentant insuffisant pour commenter. (Administrateurs, n'hésitez pas à couper ceci dans un commentaire ci-dessus.) Réponse de l'utilisateur "danicotra" commençant par "J'utilise également un événement VBA / Macro basé sur Worksheet_Change, mais mon approche ..." avec
'first remove filter
' puis l'applique
est à nouveau la bonne solution lors de l'utilisation d'Excel 2007+. Cependant .AutoFilter.ApplyFilter n'est pas valide dans XL03 et plus tôt, donc je montre le chemin ci-dessous.

Je supplie les vrais experts et gourous de lire le code parce que je suis assez confiant qu'il s'agit d'un matériau de première qualité. Peut-être que le décompte inexplicable de cette réponse peut être inversé lorsque les gens voient ce qui est bien fait ci-dessous.

danicotra a utilisé un exemple simplifié. En fait, vous pouvez le faire plus généralement. Supposons avec ActiveSheet pour les éléments suivants (ou un autre objet de feuille):

  1. Enregistrez la plage du filtre automatique. Il contient des colonnes .AutoFilter.Filters.Count et (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), enregistrées dans rngAutofilter

  2. Collectez dans un tableau myAutofilters chacune des 4 propriétés de chacun des éléments de filtre automatique .AutoFilter.Filters.Count, en veillant à éviter les "erreurs définies par l'application" lorsque .On ou .Operator est faux. (myAutofilters serait redimensionné au nombre de lignes et de colonnes à 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 .Selon votre tableau enregistré, réinitialisez 3 des 4 propriétés de chacun des éléments de filtre automatique .AutoFilter.Filters.Count. Veillez à nouveau à éviter les «erreurs définies par l'application» lorsque .Operator est faux, donc pour chaque élément «i»,
    rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
    ou
    rngAutofilter.AutoFilter Field: = i, Critères1: = myAutofilters (i, 2), Opérateur: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)

Maintenant, le filtre automatique sera réinstauré, sur la même plage qu'avant le début de votre code, mais avec le filtre automatique 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
MicrosoftShouldBeKickedInNuts
la source
Pourquoi dans le MONDE quelqu'un voterait-il contre cette réponse utile, qui inclut même un code autonome complet (et fortement testé), et donne même une explication détaillée du code? Je demande sérieusement. Les gens veulent-ils une bonne aide professionnelle en super-utilisateur ou ne devrais-je même pas m'embêter? Y a-t-il des trolls qui ne font que voter en aval, afin de se soutenir relativement ??
MicrosoftShouldBeKickedInNuts
2
Ayez au moins les b___s pour commenter si vous downvote, afin que je puisse utiliser les commentaires pour mieux servir la communauté. Admins, c'est une proposition que je voudrais faire. Tous les downvotes nécessitent un commentaire explicatif. J'ai vu de nombreux postes clairement inexplicables, ce qui semble vraiment être une épidémie en superutilisateur - et nulle part ailleurs.
MicrosoftShouldBeKickedInNuts
+1 pour "Tous les downvotes nécessitent un commentaire explicatif."
Gravitation le
-1
en utilisant "data, from table" / power query dans excel, ce qui nous donne la possibilité d'actualiser les données lors de l'ouverture du fichier.
(également tri automatique et colonne d'index (nombre de lignes filtrées automatiquement))

Cela créera un résultat dans une autre feuille.

-sélectionnez les données requises à l'aide de la souris (lignes et colonnes)
-cliquez sur l'onglet des données, depuis le tableau
-dans la dernière colonne, exclure les blancs (facultatif, si vous souhaitez afficher uniquement les cellules remplies)
-add column, index column (facultatif, si vous souhaitez ajouter un numéro de ligne aux résultats filtrés)
-fermer et charger

pour modifier à nouveau, cliquez sur l'onglet de requête, puis sur modifier

cliquez sur l'onglet de conception dans Excel, sur la flèche ci-dessous actualiser, les propriétés de connexion,
actualiser les données lors de l'ouverture du fichier.


adapté de: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
partie: 3. Tri des listes déroulantes à l'aide de Power Query


vous pouvez également copier les données de la feuille Sheet1 si elles ne sont pas vides, par exemple le champ a1.
copiez ceci dans le champ a1 de la feuille sheet2:
= SI (feuille1! A1 ""; feuille1! A1; "")

Bojan Djuric
la source