Excel 2013 VBA очистить активный фильтр

мне нужно очистить все активные фильтры от листа перед запуском определенного макроса, эта строка отлично работает, если есть активный фильтр на

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

однако, если фильтры не выбраны, он возвращает ошибку

Runtime error '1004';
ShowAllData method of Worksheet class failed

Я получил этот код от ответа на этот вопрос Excel 2013 VBA очистить все фильтры макрос

однако этот вопрос не объясняет, как игнорировать строку, если фильтры не активны.

Как я игнорировать эту строку, если в настоящее время активные фильтры не применяются?

редактировать

например, все заголовки столбцов были автоматически отфильтрованы, поэтому, если мой лист отфильтрован "женщиной", например, мне нужно удалить этот фильтр перед запуском макроса, однако, если фильтры не были применены, просто запустите макрос как обычно

3 ответов


используйте FilterMode вместо AutoFilterMode. Я часто имел дело с фильтрами, и этот код отлично работает.

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

убедитесь, что лист не защищен, так как это также дает ошибку 1004.


Я искренне восхищаюсь вашим желанием программировать для конкретных обстоятельств, но я должен признать, что самый быстрый способ сделать это с On Error Resume Next.

On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0

вам не нужно ломать что-то, чтобы проверить, существует ли оно, но в VBA это иногда лучший выход. Лично я оцениваю On Error Resume Next С SendKeys как метод программирования.

вышеуказанный метод не требует, чтобы вы проверяли, если .AutoFilterMode is правда.


Я знаю, что это относительно старый пост и не очень нравится быть некромантом... Но поскольку у меня была та же проблема и я попробовал несколько вариантов в этой теме без успеха, я объединил некоторые ответы, чтобы получить рабочий макрос..

надеюсь, это поможет кто-то там :)

Sub ResetFilters()
  On Error Resume Next
  For Each wrksheet In ActiveWorkbook.Worksheets
    wrksheet.ShowAllData 'This works for filtered data not in a table
    For Each lstobj In wrksheet.ListObjects
      If lstobj.ShowAutoFilter Then
        lstobj.Range.AutoFilter 'Clear filters from a table
        lstobj.Range.AutoFilter 'Add the filters back to the table
      End If
    Next 'Check next worksheet in the workbook
  Next
End Sub

* * возможный дубликат потока:Excel 2013 VBA очистить все фильтры макрос