Не удалось выполнить метод ShowAllData класса Worksheet
Я замечаю, что мой VBA script не работает, когда уже установлен автофильтр. Любая идея, почему это?
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
AutoFilterMode будет True, если он включен, независимо от того, действительно ли фильтр применяется к определенному столбцу или нет. Когда это произойдет, ActiveSheet.ShowAllData
все равно будет выполняться, вызывая ошибку (поскольку фактическая фильтрация отсутствует).
У меня была такая же проблема, и я работал с
If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
End If
Это, по-видимому, предотвращает запуск ShowAllData, когда нет действительного фильтра, но с включенным AutoFilterMode.
Второй улов Or ActiveSheet.FilterMode
должен ловить расширенные фильтры
Ответ 2
Простым способом избежать этого является использование метода рабочей таблицы ShowAllDatap >
Автофильтр имеет тот же метод ShowAllData, который не выдает ошибку, если фильтр включен, но фильтр не установлен.
If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData
Ответ 3
Ошибка 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
.
Ответ 4
Я только что испытал ту же проблему. После некоторой пробной ошибки я обнаружил, что если выбор был справа от моей области фильтра. И количество показанных записей было равно нулю, ShowAllData потерпит неудачу.
Возможно, немного больше контекста. У меня есть несколько листов, каждый с фильтром. Я хотел бы установить некоторые стандартные фильтры на всех листах, поэтому я использую некоторые VBA, подобные этому
Sheets("Server").Select
col = Range("1:1").Find("In Selected SLA").Column
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE"
Этот код будет настраивать фильтр в столбце с заголовком "В выбранном SLA" и оставить все остальные фильтры без изменений. У этого есть неудачный побочный эффект, который я могу создать фильтр, который показывает нулевые записи. Это невозможно, используя только пользовательский интерфейс.
Чтобы избежать этой ситуации, я хотел бы, чтобы reset все фильтры, прежде чем применять фильтрацию выше. Мой код reset выглядел так:
Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Обратите внимание, что я не перемещал выбранную ячейку. Если выбор был справа, он не удалял фильтры, таким образом, чтобы код фильтра создавал фильтр с нулевой строкой. Во второй раз, когда код запускается (в фильтре с нулевой строкой) ShowAllData завершится с ошибкой.
Обходной путь прост: переместите выделение внутри столбцов фильтра перед вызовом ShowAllDatap >
Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Это было в Excel версии 14.0.7128.5000 (32-разрядная версия) = Office 2010
Ответ 5
Это будет работать Определите это, а затем позвоните, когда вам это нужно. (Хорошо для логики кнопок, если вы делаете кнопку очистки):
Sub ResetFilters()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
Ответ 6
У меня тоже такая же проблема. Я думаю, что причина в том,
1) Когда моя активная ячейка находится внутри таблицы, "ActiveSheet.ShowAllData" может работать.
2) Когда моя активная ячейка не в таблице,
"ActiveSheet.ShowAllData" не может работать. Используя этот код, ActiveSheet.ListObjects("Srv"). Range.AutoFilter Field: = 1 может очистить фильтр.