Excel VBA – ActiveSheet.ShowAllData, La 1004 : “La méthode ShowAllData de la classe Worksheet a échoué”

Bonjour à tous,

Si vous avez déjà eu à utiliser ShowAllData en VBA, vous avez certainement rencontré ceci !

ShowAllData-Excel-VBA-1004

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 :
Table-ShowAllData-Excel-VBA-1004

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

Pour marque-pages : Permaliens.

4 réponses à Excel VBA – ActiveSheet.ShowAllData, La 1004 : “La méthode ShowAllData de la classe Worksheet a échoué”

  1. Claude dit :

    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

  2. philippe ESTEVEZ dit :

    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

  3. Gaetan dit :

    Merci pour le partage.
    Gaetan

  4. Emmanuelle dit :

    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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.