2013-08-14 8 views
22

Я замечаю, что мой скрипт VBA не работает, когда уже установлен автофильтр. Любая идея, почему это так?ShowAllData метод класса Worksheet failed

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 

Большое спасибо

+1

Какая ошибка вы получаете на линии, на которой он падает? –

+0

ошибка во время выполнения: ShowAllData метод класса Worksheet не удалось –

ответ

6

ошибка ShowAllData method of Worksheet class failed обычно возникает при попытке удалить использованный фильтр, когда не один применяется.

Я не уверен, что вы пытаетесь удалить все AutoFilter или просто удалите любой прикладной фильтр, но для каждого из них существуют разные подходы.

Чтобы удалить использованный фильтр, но оставить AutoFilter на:

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

Смысл приведенного выше кода, чтобы проверить, что есть имеет AutoFilter, или был применен фильтр (это будет также удалить дополнительные фильтры) ,

Чтобы полностью удалить AutoFilter:

ActiveSheet.AutoFilterMode = False 

В приведенном выше случае, вы просто отключить AutoFilter полностью.

+0

Я обновил свой код к следующему: Если ActiveSheet.AutoFilterMode Тогда ActiveSheet.AutoFilterMode = False Если ActiveSheet.FilterMode Тогда ActiveSheet.FilterMode = False Я хочу, чтобы полностью удалить фильтры , Однако теперь я замечаю, что метод пасты также вставляет в первую (невидимую?) Три ячейки. Я не могу это понять. –

+1

@KrisVandenBergh Я рад, что начальная проблема решена :) Если есть еще одна проблема с вашим методом «PasteSpecial», возможно, стоит поднять новый вопрос, так как это нужно было выяснить ошибку с помощью «AutoFilter». –

+0

@KrisVandenBergh Как ваша оригинальная проблема была решена, можете ли вы пометить этот вопрос как ответ? Спасибо –

29

AutoFilterMode будет True, если он включен, независимо от того, действительно ли фильтр применяется к определенному столбцу или нет. Когда это произойдет, ActiveSheet.ShowAllData все равно будет запускаться, вызывая ошибку (поскольку фактическая фильтрация отсутствует).

У меня был тот же вопрос и получил его работы с

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

Это, кажется, чтобы предотвратить ShowAllData от бега, когда нет никакого фактического применения фильтра, но с AutoFilterMode включен.

Второй улов Or ActiveSheet.FilterMode должен поймать дополнительные фильтры

+12

Существует логическая проблема: ** (A и B) или B == B **, поэтому ваше решение эквивалентно. , , , , 'If ActiveSheet.FilterMode Then ...' – MGM

1

Я только испытал те же проблемы. После некоторой пробной ошибки я обнаружил, что , если выбор был справа от области моего фильтра. И количество показанных записей было равно нулю, ShowAllData завершится с ошибкой.

Возможно, немного больше контекста. У меня есть несколько листов, каждый с фильтром. Я хотел бы установить некоторые стандартные фильтры на всех листах, поэтому я использую некоторые VBA как этот

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

Этот код будет настроить фильтр на колонке с заголовком «В Selected ОАС», и оставить все другие фильтры без изменений , У этого есть неудачный побочный эффект, который я могу создать фильтр, который показывает нулевые записи. Это невозможно с использованием пользовательского интерфейса.

Чтобы избежать этой ситуации, я хотел бы сбросить все фильтры, прежде чем применять фильтрацию выше. Мой код возврата выглядел так:

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

Обратите внимание, что я не перемещал выбранную ячейку. Если выбор был справа, он не удалял фильтры, таким образом, чтобы код фильтра создавал фильтр с нулевой строкой. Во второй раз, когда выполняется код (в фильтре с нулевой строкой) ShowAllData завершится с ошибкой.

Обходной проста: Перемещение выделения внутри колонн фильтра перед вызовом ShowAllData

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

Это было Excel версии 14.0.7128.5000 (32-разрядная версия) = Office 2010

+0

Выбор применим только при работе с ListObjects - их можно отфильтровать отдельно, более чем одну область на одном листе. Обычный (одиночный) лист Фильтр может быть доступен просто через объект Worksheet. – MGM

10

Простой способ Во избежание этого не использовать метод листа ShowAllData

Автофильтр имеет тот же самый метод ShowAllData который не выбрасывает ошибку, когда фильтр включен, но ни один фильтр не установлен

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

+0

Не являются ли методы 'Autofilter' и' ShowAllData' разными методами? В то время как 'Autofilter' ** удаляет ** фильтр,' ShowAllData' только ** очищает ** его. – Mertinc

+0

OP ссылается на Worksheet.ShowAllData, выдающий ошибку при включении фильтра, но не выбран критерий, и мой ответ заключается в использовании Worksheet.Autofilter.ShowAllData, которая не вызывает ошибку, если критерии фильтра не выбраны. - Это ShowAllData, это тот же метод, –

+0

Я не знал, что разница, и на самом деле это также решило мою текущую проблему после вашего лучшего объяснения Стивена, спасибо большое! – Mertinc

Смежные вопросы