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) :
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
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)
Désactivez le filtre mais conservez les listes déroulantes avec ShowAllData
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