2013-08-14 10 views
22

Ich merke, dass mein VBA-Skript nicht funktioniert, wenn ein Autofilter bereits aktiviert ist. Irgendeine Idee warum das ist?ShowAllData-Methode der Worksheet-Klasse fehlgeschlagen

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 

Vielen Dank

+1

Welchen Fehler bekommen Sie in der Zeile, es stürzt ab? –

+0

Ein Laufzeitfehler: ShowAllData Methode der Arbeitsblatt-Klasse ist fehlgeschlagen –

Antwort

6

Der Fehler ShowAllData method of Worksheet class failed tritt in der Regel, wenn Sie versuchen, eine Anwendung Filter zu entfernen, wenn es nicht eine Anwendung ist.

Ich bin mir nicht sicher, ob Sie versuchen, die ganze AutoFilter zu entfernen, oder einfach alle angewandten Filter entfernen, aber es gibt verschiedene Ansätze für jede.

ein angelegtes Filter zu entfernen, aber AutoFilter auf verlassen:

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

Die Logik hinter dem obigen Code zu testen ist, dass es ein AutoFilter ist oder ob ein Filter angewandt wurde (dies wird auch erweiterte Filter entfernen) .

ActiveSheet.AutoFilterMode = False 

Im obigen Fall, Sie sind die AutoFilter ganz einfach deaktivieren:

Um vollständig die AutoFilter zu entfernen.

+0

ich meinen Code auf die folgenden aktualisiert: Wenn ActiveSheet.AutoFilterMode Dann ActiveSheet.AutoFilterMode = False Wenn ActiveSheet.FilterMode Dann ActiveSheet.FilterMode = False Ich mag die Filter vollständig entfernen . Allerdings bemerke ich jetzt, dass die Pastenmethode auch in die ersten (unsichtbaren?) Drei Zellen eingefügt wird. Ich kann das nicht verstehen. –

+1

@KrisVandenBergh Ich bin froh, dass das anfängliche Problem gelöst wurde :) Wenn es ein anderes Problem mit Ihrer 'PasteSpecial' Methode gibt, könnte es sich lohnen, eine neue Frage zu stellen, da diese den Fehler mit dem' AutoFilter' herausfinden sollte. –

+0

@KrisVandenBergh Nachdem Ihr ursprüngliches Problem gelöst wurde, können Sie diese Frage als beantwortet markieren? Danke –

29

AutoFilterMode ist True, wenn es aktiviert ist, unabhängig davon, ob tatsächlich ein Filter auf eine bestimmte Spalte angewendet wurde oder nicht. In diesem Fall wird ActiveSheet.ShowAllData weiterhin ausgeführt und es wird ein Fehler ausgegeben (weil keine Filterung vorhanden ist).

hatte ich das gleiche Problem und habe es mit

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

arbeiten Diese ShowAllData Laufen zu verhindern scheint, wenn kein angewendet eigentliche Filter ist es aber mit AutoFilterMode eingeschaltet.

Der zweite Fang Or ActiveSheet.FilterMode sollte erweiterte Filter

+12

Es gibt ein logisches Problem: ** (A und B) oder B == B **, daher ist Ihre Lösung gleichwertig. . . . . 'Wenn ActiveSheet.FilterMode Then ...' – MGM

1

Ich habe fangen gerade erlebt das gleiche Problem. Nach einigem Versuch und Irrtum entdeckte ich, dass , wenn die Auswahl rechts von meinem Filterbereich war UND die Anzahl der angezeigten Datensätze Null war, würde ShowAllData fehlschlagen.

Ein wenig mehr Kontext ist wahrscheinlich relevant. Ich habe eine Reihe von Blättern mit jeweils einem Filter. Ich möchte einige Standardfilter auf allen Blättern einzurichten, deshalb verwende ich einige VBA wie diese

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

Dieser Code wird der Filter auf die Spalte mit Überschrift „In Ausgewählte SLA“ einzustellen, und lassen Sie alle anderen Filter unverändert . Dies hat den unglücklichen Nebeneffekt, dass ich einen Filter erstellen kann, der null Datensätze anzeigt. Dies ist nur mit der Benutzeroberfläche möglich.

Um dies zu vermeiden, möchte ich alle Filter zurücksetzen, bevor ich die obige Filterung anwende. Mein Reset-Code sah so aus:

Beachten Sie, wie ich die ausgewählte Zelle nicht verschoben habe. Wenn die Auswahl rechts wäre, würden Filter nicht entfernt, so dass der Filtercode einen Nullzeilenfilter erstellt. Beim zweiten Mal, wenn der Code ausgeführt wird (bei einem Nullzeilenfilter), schlägt ShowAllData fehl.

Die Abhilfe ist einfach: Bewegen Sie die Auswahl in den Filterspalten vor ShowAllData Aufruf

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

Dies war auf Excel Version 14.0.7128.5000 (32-Bit) = Office 2010

+0

Die Auswahl ist nur relevant, wenn Sie mit ListObjects arbeiten - diese können separat gefiltert werden, mehr als ein Bereich in einem einzelnen Blatt. Der normale (einzelne) Blattfilter kann einfach über das Worksheet-Objekt aufgerufen werden. – MGM

10

Der einfache Weg zu vermeiden diese das Arbeitsblatt Methode ShowAllData nicht zu verwenden ist

Autofilter hat die gleiche ShowAllData Methode, die keinen Fehler werfen, wenn der Filter aktiviert, aber kein Filter eingestellt ist

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

+0

Sind 'Autofilter 'und' ShowAllData' nicht unterschiedliche Methoden? Während 'Autofilter' ** Filter entfernt, löscht' ShowAllData' nur ** es **. – Mertinc

+0

Das OP bezieht sich auf Worksheet.ShowAllData gibt einen Fehler, wenn der Filter aktiviert ist, aber keine Kriterien ausgewählt ist, und meine Antwort ist die Verwendung von Worksheet.Autofilter.ShowAllData, die keinen Fehler verursacht, wenn keine Filterkriterien ausgewählt ist. - Es ist ShowAllData, das ist die gleiche Methode, –

+0

Ich kannte diesen Unterschied nicht und tatsächlich löste das auch mein aktuelles Problem nach Ihrer besseren Erklärung Steven, vielen Dank! – Mertinc

Verwandte Themen