web-dev-qa-db-fra.com

La méthode ShowAllData de la classe Worksheet a échoué

Je remarque que mon script VBA ne fonctionne pas quand un filtre automatique est déjà activé. Une idée pourquoi c'est?

    wbk.Activate
    Set Criteria = Sheets("Sheet1").Cells(i, 1)

    Set rng = Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 4))

    wb.Activate
    If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData 'remove autofilter, but it crashes on this line

    Selection.AutoFilter

    Range("$A$1:$BM$204").AutoFilter Field:=2, Criteria1:=Criteria.Value

    rng.Copy

    Range("$BC$2:$BE$204").SpecialCells(xlCellTypeVisible).PasteSpecial

Merci beaucoup

25
Kris Van den Bergh

AutoFilterMode sera True s'il est activé, qu'il s'agisse ou non d'un filtre appliqué à une colonne spécifique. Lorsque cela se produit, ActiveSheet.ShowAllData sera toujours exécuté, générant une erreur (car il n'y a pas de filtrage réel).

J'ai eu le même problème et je l'ai fait fonctionner avec 

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
  ActiveSheet.ShowAllData
End If

Cela semble empêcher ShowAllData de s'exécuter lorsqu'aucun filtre n'est appliqué, mais avec AutoFilterMode activé.

La deuxième capture Or ActiveSheet.FilterMode devrait capturer les filtres avancés

37
Aaron Brock

Le moyen simple d'éviter cela est de ne pas utiliser la méthode de feuille de calcul ShowAllData

Le filtre automatique a la même méthode ShowAllData qui ne génère pas d'erreur lorsque le filtre est activé mais qu'aucun filtre n'est défini

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

17
Steven Martin

L'erreur ShowAllData method of Worksheet class failed se produit généralement lorsque vous essayez de supprimer un filtre appliqué alors qu'aucun filtre n'est appliqué.

Je ne sais pas si vous essayez de supprimer la totalité de la AutoFilter, ou tout simplement de supprimer tout filtre appliqué, mais il existe différentes approches pour chacun.

Pour supprimer un filtre appliqué tout en laissant AutoFilter:

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

La raison d'être du code ci-dessus est de vérifier qu'il existe une AutoFilter ou qu'un filtre a été appliqué (cela supprimera également les filtres avancés).

Pour supprimer complètement la AutoFilter:

ActiveSheet.AutoFilterMode = False

Dans le cas ci-dessus, vous désactivez simplement la AutoFilter complètement.

7
Martin

Je viens de rencontrer le même problème. Après quelques essais et erreurs, j'ai découvert que si la sélection était à droite de ma zone de filtre ET si le nombre d'enregistrements affichés était égal à zéro, ShowAllData échouerait .

Un peu plus de contexte est probablement pertinent. J'ai un certain nombre de feuilles, chacune avec un filtre. Je voudrais installer des filtres standard sur toutes les feuilles, donc j'utilise des VBA comme ceci

Sheets("Server").Select
col = Range("1:1").Find("In Selected SLA").Column
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE"

Ce code ajuste le filtre sur la colonne avec l'en-tête "Dans le contrat de niveau de service sélectionné" et laisse tous les autres filtres inchangés. Cela a pour effet malheureux que je puisse créer un filtre qui affiche zéro enregistrement. Ce n'est pas possible en utilisant l'interface utilisateur seule.

Pour éviter cette situation, je souhaite réinitialiser tous les filtres avant d'appliquer le filtrage ci-dessus. Mon code de réinitialisation ressemblait à ceci

Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

Notez que je n'ai pas déplacé la cellule sélectionnée. Si la sélection était à droite, les filtres ne seraient pas supprimés, ce qui permettrait au code de filtre de créer un filtre à zéro ligne. La deuxième fois que le code est exécuté (sur un filtre à zéro ligne), ShowAllData échouera.

La solution de contournement est simple: déplacez la sélection dans les colonnes du filtre avant d'appeler ShowAllData.

Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

C'était sur la version Excel 14.0.7128.5000 (32 bits) = Office 2010

3
Peer Sommerlund

Je suis aussi le même problème. Je pense que la raison sont,

1) Lorsque ma cellule active est dans la table, "ActiveSheet.ShowAllData" peut être un travail . 2) Lorsque ma cellule active ne figure pas dans la table, "ActiveSheet.ShowAllData" ne peut pas fonctionner. ("Srv"). Range.AutoFilter Field: = 1 peut effacer le filtre.

0
Lee Li Fong