На чтение 4 мин. Просмотров 14.3k.
Итог: узнайте, как очистить все фильтры и фильтры в одном столбце с помощью макросов VBA. Включает примеры кода для регулярных диапазонов и таблиц Excel.
Уровень мастерства: Средний
Содержание
- Скачать файл
- Очистить все фильтры из диапазона
- Ошибка метода ShowAllData
- Очистить все фильтры из таблицы Excel
- Очистить все фильтры во всех таблицах на листе
- Очистить фильтры в одной колонке
- Фильтры и типы данных
Скачать файл
Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров. Пожалуйста, ознакомьтесь с моей статьей Фильтрация сводной таблицы или среза по самой последней дате или периоду для более подробной информации.
VBA AutoFilters Guide.xlsm (100.5 KB)
Очистить все фильтры из диапазона
Мы используем метод ShowAllData, чтобы очистить все фильтры,
примененные к диапазону.
Это аналогично нажатию кнопки «Очистить» на вкладке «Данные»
на ленте (сочетание клавиш: Alt, A, C)
К рабочему листу может быть применен только один диапазон
фильтров, поэтому мы на самом деле очищаем фильтры на листе.
Sub Clear_All_Filters_Range() ' Для очистки всех фильтров используйте метод ShowAllData ' для листа. Добавьте обработку ошибок, чтобы обойти ошибку, если ' фильтры не применяются. Не работает для таблиц. On Error Resume Next Sheet1.ShowAllData On Error GoTo 0 End Sub
Ошибка метода ShowAllData
Если к любому столбцу не применены фильтры, метод ShowAllData вызовет ошибку. Это ошибка времени выполнения ‘1004 с описанием:
Method ‘ShowAllData’ of object ‘_Worksheet’ failed.
Следующая строка On Error Resume Next будет игнорировать эту
ошибку. При ошибке GoTo 0 сбрасывается, поэтому ошибки возникают в любых
строках кода ниже.
Примечание. Когда метод ShowAllData упоминается как элемент листа, он НЕ очищает фильтры, которые применяются к таблицам Excel (ListObjects), если в таблице не выбрана ячейка. Поэтому лучше всего использовать приведенный ниже код для таблиц.
Чтобы очистить все фильтры таблицы Excel (ListObject), мы
также используем метод ShowAllData. В этом случае ShowAllData является членом
свойства AutoFilter объекта ListObject.
Sub Clear_All_Filters_Table() Dim lo As ListObject ' Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) ' Очистить все фильтры для всей таблицы lo.AutoFilter.ShowAllData End Sub
Очистить все фильтры во всех таблицах на листе
Приведенный выше код удаляет фильтры только для одной
таблицы. Мы можем просмотреть таблицы на листе, чтобы удалить все фильтры из
каждой таблицы.
Sub Clear_All_Table_Filters_On_Sheet() Dim lo As ListObject ' Перебрать все таблицы на листе For Each lo In Sheet1.ListObjects ' Очистить все фильтры для всей таблицы lo.AutoFilter.ShowAllData Next lo End Sub
Очистить фильтры в одной колонке
Чтобы очистить фильтры для одного столбца, мы используем
метод AutoFilter. Мы ссылаемся только на параметр Field и устанавливаем
значение для номера столбца, который мы хотим очистить.
Sub Clear_Column_Filter_Range() ' Чтобы очистить фильтр от одного столбца, укажите ' Только номер поля и никаких других параметров Sheet1.Range("B3:G1000").AutoFilter Field:=4 End Sub
Поле — это номер столбца диапазона, к которому применяются
фильтры, а не номер столбца рабочего листа.
Тот же метод используется для очистки фильтров, примененных
к столбцу в таблице. В этом случае метод AutoFilter является членом объекта
Range объекта ListObject.
Sub Clear_Column_Filter_Table() Dim lo As ListObject ' Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) ' Очистить фильтр в столбце одной таблицы, ' указав только параметр поля lo.Range.AutoFilter Field:=4 End Sub
Фильтры и типы данных
Параметры
раскрывающегося меню фильтра изменяются в зависимости от типа данных в столбце.
У нас есть разные фильтры для текста, чисел, дат и цветов. Это создает МНОГО
различных комбинаций операторов и критериев для каждого типа фильтра.
Я создал отдельные статьи для каждого из этих типов фильтров. Статьи содержат пояснения и примеры кода VBA.
- Как фильтровать числа с помощью VBA
- Как отфильтровать пустые и непустые ячейки
- Как фильтровать текст с помощью VBA
- Как отфильтровать даты по VBA
- Как отфильтровать цвета и значки с помощью VBA
Файл в разделе загрузок выше содержит все эти примеры кода в одном месте. Вы можете добавить его в свою личную книгу макросов и использовать макросы в своих проектах.
Пожалуйста, оставьте
комментарий ниже с любыми вопросами или предложениями. Спасибо!
This thread is ancient, but I wasn’t happy with any of the given answers, and ended up writing my own. I’m sharing it now:
We start with:
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
We can feed a specific worksheet to this macro which will unfilter just that one worksheet. Useful if you need to make sure just one worksheet is clear. However, I usually want to do the entire workbook
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
You can use this, by, for example, opening a workbook you need to deal with and resetting their filters before doing anything with it:
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
The one I use the most: Resetting all filters in the workbook that the module is stored in:
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
VBA remove filter from table in Excel. In this tutorial we learn how to remove or clear or delete filter from table. We use AutoFilter and ShowAllData method. It helps to show or display complete data for table. Let us see syntax, different examples using VBA. Also find and learn step by step instructions to run vba example macro code.
Table of Contents:
- Objective
- VBA Syntax to Remove Filter from Table in Excel
- VBA Remove Filter from Table
- VBA Delete Filter on Single Column from Table
- Clear Filter on Multiple Columns From Table
- VBA Clear All Filters from All Tables on Worksheet
- Clear All Filters from All Tables on the Workbook
- Instructions to Run VBA Macro Code
- Other Useful Resources
VBA Syntax to Remove or Clear Filter from Table in Excel
Let us see the syntax to remove filter from table in Excel.
expression.AutoFilter.ShowAllData
Where
expression represents ListObject.
AutoFilter represents object.
ShowAllData represents method of the AutoFilter object.
VBA Remove Filter from Table
Here is a simple example macro to remove filter from table.
'Remove Filter from Table in Excel VBA Sub VBAF1_Remove_filter_from_Table() 'Declare Variables Dim oSheetName As Worksheet Dim sTableName As String Dim loTable As ListObject 'Define Variable sTableName = "MyTable" 'Define WorkSheet object Set oSheetName = Sheets("Table") 'Define Table Object Set loTable = oSheetName.ListObjects(sTableName) 'Add filter to table loTable.AutoFilter.ShowAllData End Sub
Delete Filter on Single Column from Table
Let us see another example delete filter on single column from table in Excel VBA. Here we have to specify column number to delete filter from table.
'VBA Delete Filter on Single Column from Table Sub VBAF1_Delete_filter_OnSingle_Column_from_table() 'Declare Variables Dim oSheetName As Worksheet Dim sTableName As String Dim loTable As ListObject 'Define Variable sTableName = "MyTable" 'Define WorkSheet object Set oSheetName = Sheets("Table") 'Define Table Object Set loTable = oSheetName.ListObjects(sTableName) 'Add filter to table loTable.Range.AutoFilter Field:=3 End Sub
Clear Filter on Multiple Columns From Table in Excel VBA
Here is one more example clear filter on multiple columns from table in Excel VBA. Here we have to specify multiple column numbers to clear filter from table.
'Clear Filter on Multiple Columns From Table Sub VBAF1_Clear_filter_OnMultiple_Columns_From_Table() 'Declare Variables Dim oSheetName As Worksheet Dim sTableName As String Dim loTable As ListObject 'Define Variable sTableName = "MyTable" 'Define WorkSheet object Set oSheetName = Sheets("Table") 'Define Table Object Set loTable = oSheetName.ListObjects(sTableName) loTable.Range.AutoFilter Field:=2 loTable.Range.AutoFilter Field:=3 End Sub
VBA Clear All Filters from All Tables on Worksheet in Excel
Let us see another example to clear filters from all tables on worksheet in Excel VBA. We loop through all the tables worksheets on the worksheet.
'VBA Clear All Filters from All Tables on Worksheet Sub VBAF1_Clear_All_Filters_From_All_Tables_OnWorksheet() 'Declare Variables Dim oSheetName As Worksheet Dim loTable As ListObject 'Define WorkSheet object Set oSheetName = Sheets("Table") 'Loop Through All Tables on the Worksheet For Each loTable In oSheetName.ListObjects 'Clear Filter from the Table loTable.AutoFilter.ShowAllData Next loTable End Sub
Clear All Filters from All Tables on the Workbook using VBA
One more example to clear filters from all tables on the worksheet using Excel VBA. We loop through all the tables in all worksheets on the worksheet.
'Clear All Filters from All Tables on the Workbook Sub VBAF1_Clear_All_Filters_From_All_Tables_InWorkbook() 'Declare Variables Dim oSheetName As Worksheet Dim loTable As ListObject 'Loop Through All Tables in the Workbook For Each oSheetName In Worksheets 'Loop Through All Tables on the Worksheet For Each loTable In oSheetName.ListObjects 'Clear Filter from the Table loTable.AutoFilter.ShowAllData Next loTable Next oSheetName End Sub
Instructions to Run VBA Macro Code or Procedure:
You can refer the following link for the step by step instructions.
Instructions to run VBA Macro Code
Other Useful Resources:
Click on the following links of the useful resources. These helps to learn and gain more knowledge.
VBA Tutorial VBA Functions List VBA Arrays in Excel VBA Tables and ListObjects
VBA Editor Keyboard Shortcut Keys List VBA Interview Questions & Answers Blog
D07 Пользователь Сообщений: 60 |
Добрый день. — ActiveSheet.ShowAllData Я так понимаю, что нужно добавить что то, чтобы при нажатии на кнопку при отсутствии фильтров, он просто вхолостую щелкал и все. Но я в этом ни бум-бум. Помогите пожалуйста. |
SAS888 Пользователь Сообщений: 757 |
#2 01.03.2018 06:36:09 Если требуется «Отобразить все» не зависимо от того, применен автофильтр или нет, то можно так:
Если же требуется вообще удалить автофильтр с листа, то так:
Чем шире угол зрения, тем он тупее. |
||||
D07 Пользователь Сообщений: 60 |
«Если требуется «Отобразить все» не зависимо от того, применен автофильтр или нет, то можно так:» Да, Вы меня правильно поняли. Вставил в макрос — не работает . Выдает ту же ошибку в той же строке |
D07 Пользователь Сообщений: 60 |
Прошу прощения — это я балбес. Нужно было разнести по разным строкам |
DopplerEffect Пользователь Сообщений: 527 |
#5 01.03.2018 07:45:56
Этот код должен работать, сам проверял в работе, а выложите пример файла. |
||
ZVI Пользователь Сообщений: 4328 |
#6 01.03.2018 07:53:18
Или так: If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData |
||
D07 Пользователь Сообщений: 60 |
#7 01.03.2018 11:26:33
Все работает, я просто невнимательно сделал первый раз. |
||
adamm Пользователь Сообщений: 830 |
#8 04.11.2019 09:51:03 Всем привет!
, но после снятия всех фильтров в заголовках остаются кнопки, вроде как фильтр не снят, но на само деле снят, как можно исправить Прикрепленные файлы
|
||
skais675 Пользователь Сообщений: 2178 |
#9 04.11.2019 10:07:26
Мой канал |
||
adamm Пользователь Сообщений: 830 |
#10 04.11.2019 10:29:01 skais675, спасибо, я нашёл вот такой код, http://qaru.site/questions/228230/removing-filters-for-each-table-in-a-workbook-vba/1202718#1202718 :
Ваш код, то же работает, но в чём разница? |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#11 04.11.2019 10:43:16 Хорошая справка по работе с фильтрами
очень плохая идея Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
skais675 Пользователь Сообщений: 2178 |
#12 04.11.2019 10:55:17 В дополнении темы — полное удаление фильтров
Мой канал |
||
adamm Пользователь Сообщений: 830 |
#13 04.11.2019 11:03:05
Ситуация так требует, данные таблицы являются промежуточным звеном, выгружаются они из PQ, а к ним привязаны формулы |
||
RAN Пользователь Сообщений: 7091 |
#14 04.11.2019 13:24:26 Вам нужно удалить фильтры, или сбросить?
|
||
geniux Пользователь Сообщений: 5 |
я пользуюсь таким кодом, если нужно сбросить фильтры на одном листе или несколько (нужно добавить кнопку) Private Sub CommandButton1_Click() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets End Sub |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#16 05.11.2019 00:03:51 geniux, Вы видели, как код выглядит у других? |
Has your data import procedure ever failed due to users applying filters on the data? This happens quite often, especially when you distribute multiple files, which you then stack. Copying filtered data copies only the filtered rows. You end up loosing the hidden rows if users filtered data before saving the workbook. Let us take a look at how to remove filters in an Excel sheet using VBA.
Before we dive into how to remove filters, let us briefly take a look at the types of filtering capability Excel offers. Filtering in Excel comes in two flavours:
- Auto Filter
- Advanced Filter
Auto filter adds dropdown buttons to the columns, which offer you a variety of filtering and sorting options through an intuitive graphical interface. Advanced Filter on the other hand, lets you specify your filtering criteria in a range of cells.
Auto Filter is easy to spot visually; the dropdowns are hard to miss. However, Advanced Filter is a harder to spot. In both cases, if some of the Row Numbers to the left of a sheet appear blue instead of the regular black colour, filters have been applied on that sheet.
Mastering both these skills are essential for anybody who uses Excel at their workplace. There are a multitude of resources on the internet on these topics. I recommend you familiarise yourself with filtering data in Excel.
The ShowAllData method of the Worksheet object lets you remove any filters that were applied on the data. However, it throws a runtime error when filters have not been applied. One could simply supress the error and call it a day, but I’d loose sleep over resorting to such cowardice. Let us try to figure out a legitimate way of finding whether or not filters have been applied on a sheet.
The FilterMode property of the Worksheet object gets set to TRUE, when filters are applied either as Auto Filters or Advanced Filters. This is a Read-Only property. It can be used to check whether any filters are applied, before using the ShowAllData method. This will help us ensure a runtime error is not triggered when calling the ShowAllData method.
If you are interested in removing the Auto Filter Dropdown buttons as well, which is how I prefer it, you can use the AutoFilterMode property to turn it off. This property is not a Read-Only property, which means you can set it to TRUE to activate AutoFilters and vice versa.
Wrapping this all up, here is a Sub that I use very frequently, which you can use in your projects:
Sub RemoveFilters(ByRef WhichSheet As Worksheet) 'If data is filtered either using AutoFilters or Advanced Filters 'Show all the data If WhichSheet.FilterMode Then WhichSheet.ShowAllData 'Hide the AutoFilter DropDown Buttons If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False End Sub
Just pass a Worksheet to the above sub to remove filters without encountering a runtime error.
Note that having Excel Tables, also known List Objects in VBA, in the worksheet could throw these properties off, especially when the active cell is in a Table. If you are using Excel Tables, and I highly recommend that you do, you can deal with filters applied to a table specifically. We will reserve that discussion for another day.
Downloads
Click the link below to download a workbook with the above code. It also has a cover macro on removing filters in the active sheet.
Further Reading
- Advanced filters come in handy when you have to apply a rather complex filter criteria repeatedly. It is also easy to filter data using VBA if you create an appropriate criteria range. Coding the application of AutoFilters is rather cumbersome. Here is an introduction to using AutoFilters in Excel:
- Excel Advanced Filter Introduction – Debra Dalgleish