Кажется, старые макросы не работают. У меня есть правильная система securti для запуска макросов VBA, но когда я попробовал несколько методов очистки ВСЕХ фильтров на рабочем листе, я получил ошибку компиляции.
Вот что я попробовал:
Sub AutoFilter_Remove ()
«Этот макрос удаляет любую фильтрацию, чтобы отобразить все данные, но не удаляет стрелки фильтра
ActiveSheet.ShowAllData
Конец Sub
< / pre > < / CODE >
У меня есть кнопки на листах, чтобы очистить все фильтры для удобства использования пользователями, поскольку на листах много столбцов, на которых есть фильтры.
Если на листе уже есть фильтр, то:
Sub Macro1()
Cells.AutoFilter
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
В Excel есть два типа фильтров:
Функция автоматического фильтра позволяет фильтровать из интерфейса Excel с помощью этих крошечных раскрывающихся кнопок. А функция расширенного фильтра позволяет фильтровать с использованием диапазона критериев.
Метод ShowAll удаляет фильтры, как в, показывает все строки, но не избавляет от этих кнопок Drop Down. Чтобы удалить эти кнопки, необходимо установить свойство AutoFilterMode рабочего листа на FALSE.
Вот Sub, который я часто использую для удаления фильтров:
Sub RemoveFilters(ByRef WhichSheet As Worksheet)
If WhichSheet.FilterMode Then WhichSheet.ShowAllData
If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False
End Sub
Это показывает все данные и удаляет раскрывающиеся кнопки. Он пригодится при укладке (копировании и вставке) данных с нескольких листов или рабочих книг. Надеюсь, это поможет.
Я обычно использую этот код
Sub AutoFilter_Remove()
Sheet1.AutoFilterMode = False 'Change Sheet1 to the relevant sheet
'Alternatively: Worksheets("[Your Sheet Name]").AutoFilterMode = False
End Sub
Это тоже сработает:
If ActiveSheet.FilterMode Then cells.AutoFilter
Сначала будет проверена, установлен ли AutoFilterMode (возможно фильтрация), затем проверена, включен ли FilterMode (вы что-то фильтруете), а затем отключите фильтрацию.
Что касается ошибок, т.е. защита - другие ответы
Добавлен контекст (мой скрипт зацикливается на листах, которые затем сохраняются как 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
.
И, наконец, это предоставит больше информации о методе .ShowAllData
.
Вот одна строка, которую я использую. Он проверяет автофильтр и, если найден, удаляет его.
В отличие от некоторых ответов, этот код не будет создавать автофильтр, если он используется на рабочем листе, который в первую очередь не фильтруется автоматически.
If Cells.AutoFilter Then Cells.AutoFilter
Я использую этот подход для многостолового стола и таблицы диапазонов как уникальный способ.
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
Просто активируйте заголовки фильтров и запустите showalldata, работает на 100%. Что-то вроде:
Range("A1:Z1").Activate
ActiveSheet.ShowAllData
Range("R1:Y1").Activate
ActiveSheet.ShowAllData
Если у вас есть полевые заголовки в A1: Z1 и R1: Y1 соответственно.
Я использую .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
Этот код очищает все фильтры и удаляет сортировку.
Источник: Удаление фильтров для каждой таблицы в рабочей книге, VBA
Вот некоторый код для фиксации фильтров. Например, если вы включаете фильтры на своем листе, вы добавляете столбец, а затем хотите, чтобы новый столбец также был покрыт фильтром.
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's 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's 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.AutoFilterMode, то ActiveSheet.Columns ("A"). AutoFilter