Подтвердить что ты не робот

Не удалось выполнить метод 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

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

4b9b3361

Ответ 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

Простым способом избежать этого является использование метода рабочей таблицы ShowAllData​​p >

Автофильтр имеет тот же метод 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 завершится с ошибкой.

Обходной путь прост: переместите выделение внутри столбцов фильтра перед вызовом ShowAllData​​p >

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 может очистить фильтр.