Bonjour à tous,
Si vous avez déjà eu à utiliser ShowAllData en VBA, vous avez certainement rencontré ceci !
Voici un petit résumé de ce qui se passe...Du moins, de ce que j'ai pu en comprendre jusqu'à présent !
Voici le lien vers le fichier
Le code utilisé est celui-ci :
ActiveSheet.ShowAllData
ou encore Feuil1.ShowAllData
qui à la lecture pourrait vouloir dire : afficher les données de la feuille active ou de la feuil1.
Mais en fait, il vaudrait mieux lire : afficher les données du filtre de la cellule active.
En effet, soit un tableau filtré comme ceci :
Le code suivant ne fonctionnera pas, car la cellule active n'est pas sur le tableau.
Sub SubShowAllData_fonctionne_pas()
Range("H1").Select
Feuil1.ShowAllData
End Sub
De fait, celui-ci fonctionnera mieux, mais je ne le comprends pas, car ca fonctionnera même si on se trouve sur une autre feuille !
Sub SubShowAllData_fonctionne_parfois()
Range("A1").Select
Feuil1.ShowAllData
End Sub
Mais malheureusement, il ne fonctionnera qu'une seule fois.
En effet, une fois que l'on aura tout ré-affiché, le code va afficher la même erreur, car toutes les données seront affichées.
D'où un test qui permet de savoir si le filtre est activé :
Sub ShowAllData_fonctionne_a_priori_toujours()
Feuil1.Select
Range("A1").Select
If Feuil1.FilterMode Then
Feuil1.ShowAllData
End If
End Sub
Et une solution alternative basée sur une idée de Dominique.
Celle-ci supprime et remet le filtre automatique.
Cette fonctionnalité ne fonctionne cependant pas avec des filtres avancés.
Sub Supprime_filtre_alternative()
Feuil1.Select
Range("A1").Select
If Feuil1.FilterMode Then
Feuil1.UsedRange.AutoFilter
Feuil1.UsedRange.AutoFilter
End If
End Sub
A bientôt
Gaëtan
J'ai effectivement le souvenir d'avoir pesté contre un certain nombre de disfonctionnements concernant les filtres VBA, y compris celui-là (et notamment un problème avec les dates, mais je ne me rappelle plus exactement ce que c'était).
Pour ma part, j'avais solutionné le problème (sans le comprendre toutefois) avec le code suivant.
Il est assez proche de la solution alternative de Dominique, mais j'utilise "CurrentRegion" au lieu de "UsedRange", et cela marche même en cas de filtre avancé.
Sub Supprime_et_rétablit_filtre()
Sheets("Base de données").Range("A1").CurrentRegion.AutoFilter
MsgBox "le filtre est à présent désactivé"
Sheets("Base de données").Range("A1").CurrentRegion.AutoFilter
MsgBox "le filtre est à nouveau activé"
End Sub
Claude
Gaetan je vous partage ce code pour cette erreur 1004 : 'parcourir toutes les feuilles du classeur à la recherche des tableaux
Sub DeleteFiltre()
Dim nomtablo As String, i as integer
Application.ScreenUpdating = False
On Error Resume Next
For i = 1 To Sheets.Count
Sheets(i).Select
nomtablo = ActiveSheet.ListObjects(xlSrcRange).Name
ActiveSheet.ListObjects(nomtablo).Range.AutoFilter 'désactive le filtre élaboré
ActiveSheet.ListObjects(nomtablo).Range.AutoFilter 'une deuxième fois pour remettre les filtres du tableau
Next i
On Error GoTo 0
Application.ScreenUpdating = True
End Sub
Merci pour le partage.
Gaetan
En fait il faut juste préciser quelle cellule A1 de quelle feuille on sélectionne et le code ne fonctionnera pas "parfois" mais "toujours".
Sub DesactiverFiltresToutesFeuilles()
Dim s As Worksheet
Dim maFeuille As Worksheet
Application.ScreenUpdating = False
Set maFeuille = ActiveSheet
For Each s In ThisWorkbook.Worksheets
If s.FilterMode Then
s.Select
s.Cells(1, 1).Select
s.ShowAllData
End If
Next s
maFeuille.Select
Set maFeuille = Nothing
Application.ScreenUpdating = True
End Sub