Ответ 1
Если на листе уже есть фильтр, то:
Sub Macro1()
Cells.AutoFilter
End Sub
удалит его.
Кажется, старые макросы не работают. У меня есть правильный securtiy для запуска макросов VBA, но когда я попробовал несколько методов очистки ВСЕХ фильтров на листе, я получаю ошибку компиляции.
Вот что я пробовал:
Sub AutoFilter_Remove()
'Этот макрос удаляет любую фильтрацию, чтобы отображать все данные, но не удаляет стрелки фильтра
ActiveSheet.ShowAllData
End Sub
У меня есть кнопки на листах, чтобы очистить все фильтры для удобства использования для пользователей, поскольку в листах есть много столбцов, на которых есть фильтры.
Если на листе уже есть фильтр, то:
Sub Macro1()
Cells.AutoFilter
End Sub
удалит его.
Попробуйте следующее:
If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData
ShowAllData выдает ошибку, если фильтр в настоящее время не применяется. Это будет работать:
Sub ResetFilters()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
Для таблиц попробуйте это проверить, включено ли и выключено:
If wrkSheetCodeName.ListObjects("TableName").ShowAutoFilter Then
wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
End if
Включение:
wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
это работает хорошо.!
If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
Я нашел, что это обходное решение работает довольно эффективно. Он в основном удаляет автофильтр из таблицы, а затем повторно применяет его, тем самым удаляя все предыдущие фильтры. По моему опыту, это не связано с обработкой ошибок, требуемой с помощью других методов, упомянутых здесь.
Set myTable = YOUR_SHEET.ListObjects("YourTableName")
myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True
Это блестящий, единственный ответ, который я нашел, который удовлетворил мою особую потребность, большое спасибо за то, что подняли его!
Я сделал небольшое дополнение, чтобы экран не мигал, и он удаляет, а затем повторно применяет пароль на каждом листе при циклическом переходе [У меня один и тот же пароль для всех листов в книге]. В духе вашего представления, я добавляю это, чтобы помочь кому-то еще....
Sub ClearFilters()
Application.ScreenUpdating = False
On Error Resume Next
For Each wrksheet In ActiveWorkbook.Worksheets
'Change the password to whatever is required
wrksheet.Unprotect Password:="Albuterol1"
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
'Change the password to whatever is required
wrksheet.Protect Password:="Albuterol1", _
DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True, _
AllowFiltering:=True
Next 'Check next worksheet in the workbook
Next
Application.ScreenUpdating = True
End Sub
Я знаю, что это довольно старая статья, и мне не очень нравится быть некромантом... Но, поскольку у меня возникла та же проблема, и я безуспешно попробовал несколько вариантов в этой теме, я объединил некоторые ответы, чтобы получить рабочий макрос..
Надеюсь, это поможет кому-то там :)
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
Это тоже будет работать:
If ActiveSheet.FilterMode Then cells.AutoFilter
Я обычно использую этот код
Sub AutoFilter_Remove()
Sheet1.AutoFilterMode = False 'Change Sheet1 to the relevant sheet
'Alternatively: Worksheets("[Your Sheet Name]").AutoFilterMode = False
End Sub
В Excel есть два типа фильтров:
Функция Auto Filter позволяет вам фильтровать из интерфейса Excel, используя эти крошечные выпадающие кнопки. А функция расширенного фильтра позволяет фильтровать с использованием диапазона критериев.
Метод ShowAll удаляет фильтры, как и в, показывает все строки, но не избавляется от этих кнопок. Чтобы удалить эти кнопки, необходимо установить для свойства AutoFilterMode рабочей таблицы значение FALSE.
Вот Sub, который я часто использую для удаления фильтров:
Sub RemoveFilters(ByRef WhichSheet As Worksheet)
If WhichSheet.FilterMode Then WhichSheet.ShowAllData
If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False
End Sub
Это показывает все данные и удаляет выпадающие кнопки. Это удобно при укладке (копировании и вставке) данных из нескольких листов или рабочих книг. Надеюсь это поможет.
Сначала будет проверяться, установлен ли AutoFilterMode (возможна фильтрация), затем проверьте, включен ли FilterMode (вы что-то фильтруете), затем отключите фильтрацию.
Относительно ошибок, т.е. защиты - другие ответы
Добавлен контекст (мой script перебирает листы, которые затем сохраняются как CSV, поэтому необходимо удалить фильтры - но включите AutoFilterMode, если установлено:
For Each WS In ActiveWorkbook.Worksheets
Select Case WS.Name
Case "01", "02", "03", "04", "05"
With WS
If WS.AutoFilterMode Then
If WS.FilterMode Then WS.ShowAllData
End If
' Processing data
End With
Case Else
' Nothing to see here
End Select
Next
Попробуйте что-то вроде этого:
Sub ClearDataFilters()
'Clears filters on the activesheet. Will not clear filters if the sheet is protected.
On Error GoTo Protection
If ActiveWorkbook.ActiveSheet.FilterMode Or _
ActiveWorkbook.ActiveSheet.AutoFilterMode Then _
ActiveWorkbook.ActiveSheet.ShowAllData
Exit Sub
Protection:
If Err.Number = 1004 And Err.Description = _
"ShowAllData method of Worksheet class failed" Then
MsgBox "Unable to Clear Filters. This could be due to protection on the sheet.", _
vbInformation
End If
End Sub
.FilterMode
возвращает true, если рабочий лист находится в режиме фильтра. (См. это для получения дополнительной информации.)
См. это для получения дополнительной информации о .AutoFilter
.
И, наконец, this предоставит больше информации о методе .ShowAllData
.
Здесь используется однострочный вкладыш. Он проверяет автофильтр и, если найден, удаляет его.
В отличие от некоторых ответов, этот код не будет создавать автоматический фильтр, если он используется на листе, который не автофильтруется в первую очередь.
If Cells.AutoFilter Then Cells.AutoFilter
Просто активируйте заголовки фильтров и запустите showalldata, работайте на 100%. Что-то вроде:
Range("A1:Z1").Activate
ActiveSheet.ShowAllData
Range("R1:Y1").Activate
ActiveSheet.ShowAllData
Если у вас есть заголовки полей в A1: Z1 и R1: Y1 соответственно.
Im используя .filtermode
, если фильтр включен, он возвращает true
Dim returnValue As Boolean
returnValue = worksheet1.FilterMode
if returnValue Then
worksheet1.ShowAllData
End If
Попробуйте следующее:
Sub ResetFilters()
Dim ws As Worksheet
Dim wb As Workbook
Dim listObj As ListObject
For Each ws In ActiveWorkbook.Worksheets
For Each listObj In ws.ListObjects
If listObj.ShowHeaders Then
listObj.AutoFilter.ShowAllData
listObj.Sort.SortFields.Clear
End If
Next listObj
Next ws
End Sub
Этот код очищает все фильтры и удаляет сортировку.
Вот какой код для фиксации фильтров. Например, если вы включите фильтры в своем листе, вы добавите столбец, затем вы хотите, чтобы новый столбец также был покрыт фильтром.
Private Sub AddOrFixFilters()
ActiveSheet.UsedRange.Select
' turn off filters if on, which forces a reset in case some columns weren't covered by the filter
If ActiveSheet.AutoFilterMode Then
Selection.AutoFilter
End If
' turn filters back on, auto-calculating the new columns to filter
Selection.AutoFilter
End Sub
Эта ветка древняя, но я не был доволен ни одним из этих ответов и в итоге написал свое собственное. Я делюсь с ним сейчас:
Начнем с:
Sub ResetWSFilters(ws as worksheet)
If ws.FilterMode Then
ws.ShowAllData
Else
End If
'This gets rid of "normal" filters - but tables will remain filtered
For Each listObj In ws.ListObjects
If listObj.ShowHeaders Then
listObj.AutoFilter.ShowAllData
listObj.Sort.SortFields.Clear
End If
Next listObj
'And this gets rid of table filters
End Sub
Мы можем подать конкретный рабочий лист на этот макрос, который будет отфильтровывать только один рабочий лист. Полезно, если вам нужно убедиться, что только один рабочий лист ясен. Тем не менее, я обычно хочу сделать всю книгу
Sub ResetAllWBFilters(wb as workbook)
Dim ws As Worksheet
Dim wb As Workbook
Dim listObj As ListObject
For Each ws In wb.Worksheets
If ws.FilterMode Then
ws.ShowAllData
Else
End If
'This removes "normal" filters in the workbook - however, it doesn't remove table filters
For Each listObj In ws.ListObjects
If listObj.ShowHeaders Then
listObj.AutoFilter.ShowAllData
listObj.Sort.SortFields.Clear
End If
Next listObj
Next
'And this removes table filters. You need both aspects to make it work.
End Sub
Вы можете использовать это, например, открыв книгу, с которой вам нужно иметь дело и сбросить свои фильтры, прежде чем что-либо делать с ней:
Sub ExampleOpen()
Set TestingWorkBook = Workbooks.Open("C:\Intel\......") 'The .open is assuming you need to open the workbook in question - different procedure if it already open
Call ResetAllWBFilters(TestingWorkBook)
End Sub
Тот, который я использую больше всего: Сброс всех фильтров в книге, в которой хранится модуль:
Sub ResetFilters()
Dim ws As Worksheet
Dim wb As Workbook
Dim listObj As ListObject
Set wb = ThisWorkbook
'Set wb = ActiveWorkbook
'This is if you place the macro in your personal wb to be able to reset the filters on any wb you're currently working on. Remove the set wb = thisworkbook if that what you need
For Each ws In wb.Worksheets
If ws.FilterMode Then
ws.ShowAllData
Else
End If
'This removes "normal" filters in the workbook - however, it doesn't remove table filters
For Each listObj In ws.ListObjects
If listObj.ShowHeaders Then
listObj.AutoFilter.ShowAllData
listObj.Sort.SortFields.Clear
End If
Next listObj
Next
'And this removes table filters. You need both aspects to make it work.
End Sub
Все, что тебе нужно:
ActiveSheet.AutoFilter.ShowAllData
Зачем? Как и лист, AutoFilter также имеет метод ShowAllData, но он не выдает ошибку, даже если автофильтр включен без активного фильтра.
Это будет сброшено, только если у вас есть фильтр, и не вызовет никаких ошибок, когда нет никакого фильтра. Если ActiveSheet.AutoFilterMode, то ActiveSheet.Columns("A"). Автофильтр
Это работает лучше всего для меня.
Я обычно использую следующее, прежде чем сохранить и закрыть файлы.
Sub remove_filters
ActiveSheet.AutofilterMode = False
End Sub
Я использую этот подход для нескольких таблиц и диапазонов как уникальный способ.
Sub RemoveFilters(Ws As Worksheet)
Dim LO As ListObject
On Error Resume Next
Ws.ShowAllData
For Each LO In Ws.ListObjects
LO.ShowAutoFilter = True
LO.AutoFilter.ShowAllData
Next
Ws.ShowAllData
End Sub
Я нашел этот ответ на веб-странице
Он использует AutoFilterMode как логическое.
If Worksheets("Sheet1").AutoFilterMode Then Selection.AutoFilter
Вы должны сначала выбрать диапазон таблицы перед использованием ActiveSheet.ShowAllData