Excel макрос для фильтрации данных

Содержание

  1. Написание макросов для фильтров
  2. Именованный диапазон для условий
  3. Макро-рекордер — твой друг (или враг)
  4. Как сделать фильтр в сводной таблице макросом
  5. Решение № 1: Макрос VBA для фильтрации сводной таблицы по определенной дате или периоду
  6. Как работает макрос?
  7. Как насчет фильтрации двух сводных таблиц за разные периоды времени?
  8. Настройка: данные конвейера продаж CRM
  9. Как установить номер поля динамически
  10. Добавляем макрос фильтрации
  11. Метод автофильтрации

Написание макросов для фильтров

Фильтры являются отличным инструментом для анализа данных в Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для применения фильтров к отдельным столбцам в наборе данных. Это помогает нам связывать цифры с отчетами и проводить исследование наших данных.

Фильтрация также может быть трудоемким процессом. Особенно, когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем данные, чтобы затем копировать / вставлять их в другие листы или книги.

В этой статье объясняется, как создавать макросы для автоматизации процесса фильтрации. Это обширное руководство по методу автофильтра в VBA.

У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.

Именованный диапазон для условий

Сначала надо создать именованный диапазон, куда мы будем вводить условия, и откуда макрос их будет брать. Для этого можно прямо над таблицей вставить пару-тройку пустых строк, затем выделить ячейки для будущих критериев (на рисунке это A2:F2) и дать им имя Условия, вписав его в поле имени в левом верхнем углу и нажав клавишу Enter. Для наглядности, я выделил эти ячейки желтым цветом:

Макро-рекордер — твой друг (или враг)

Мы можем легко получить код VBA для фильтров, включив макро-рекордер, а затем применив один или несколько фильтров к диапазону / таблице.

Вот шаги для создания макроса фильтра с помощью устройства записи макросов:

  1. Включите рекордер макросов:
    1. Вкладка «Разработчик»> «Запись макроса».
    2. Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
  2. Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
  3. Остановите рекордер.
  4. Откройте редактор VB (вкладка «Разработчик»> Visual Basic) для просмотра кода.

Если вы уже использовали макрос-рекордер для этого процесса, то вы знаете, насколько он может быть полезен. Тем более, что наши критерии фильтрации становятся более сложными.

Код будет выглядеть примерно так:

 Sub Filters_Macro_Recorder() ' ' Filters_Macro_Recorder Macro ' ' ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4, Criteria1:= _ "Product 2" ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4 ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=5, Criteria1:= _ ">=500", Operator:=xlAnd, Criteria2:="<=1000" End Sub 

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Как сделать фильтр в сводной таблице макросом

Чтобы получить данные для одного из 4-х магазинов фирмы, достаточно лишь открыть выпадающий список со всеми магазинами и выбрать один из них. Пример результата этих действий изображено на рисунке:

Изменение настроек, которые доступны в интерактивных инструментах сводной таблице доступны так же на уровне программирования макросов из редактора VBA. Выбор магазина, который является элементом поля СТРАИЦЫ реализуется с помощью свойства CurrentPage.

Просто как параметр для этого свойства следует указать название поля. Например, напишем простой код макроса, который сам выберет «Магазин3» как критерий для фильтрования данных по оборотам в сводной таблице:

SubMagazin3()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Магазины").CurrentPage ="Магазин 3"
End Sub

Чтобы создать такой макрос сначала откройте редактор VisualBasic (ALT+F11), а потом создайте новый модуль в редакторе: «Insert»-«Module» и введете в него выше указанный VBA-код:

Результат действия этого простого макроса такой же как выше рисунке, но без использования пользователем интерактивных инструментов сводной таблицы.

В методе PivotTables указан аргумент «ТаблицаМ» – это всего лишь ссылка на внутренне имя, которое было присвоено для сводной таблицы еще на этапе ее создания. Читайте пример создания где он детально описан: Макрос для создания сводной таблицы в Excel. Далее рассмотрим, как можно скрывать часть данных из области видимости значений.

Решение № 1: Макрос VBA для фильтрации сводной таблицы по определенной дате или периоду

Мы можем использовать простой макрос, чтобы установить фильтр в сводной таблице для самой последней даты в таблице исходных данных. Фильтрация поля «Дата отчета» в сводной таблице также выберет отфильтрованный элемент в срезе и отфильтрует все связанные сводные диаграммы.

Приведенный ниже макрос может выглядеть как много кода, но на самом деле он очень прост. Чтобы его использовать, вам просто нужно будет указать все переменные для имени рабочего листа, имени сводной таблицы, имени сводного поля (Дата отчета) и критериев фильтрации (последняя дата). Эти переменные будут представлять имена объектов в вашей собственной книге.

 Sub Filter_PivotField() ' Описание: фильтрация сводной таблицы или среза по определенной дате или периоду. Dim sSheetName As String Dim sPivotName As String Dim sFieldName As String Dim sFilterCrit As String Dim pi As PivotItem ' Установите переменные sSheetName = "Pivot" sPivotName = "PivotTable1" sFieldName = "Report Date" 'sFilterCrit = "5/2/2016" sFilterCrit = ThisWorkbook.Worksheets("Data").Range("G2").Value With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName) ' Очистить все фильтры основного поля .ClearAllFilters ' Проходить по элементам сводки поля сводки ' Скрыть или отфильтровать элементы, которые не соответствуют критериям For Each pi In .PivotItems If pi.Name <> sFilterCrit Then pi.Visible = False End If Next pi End With End Sub 

Макрос в настоящее время настроен на использование значения из ячейки G2 в Таблице данных для критериев фильтра (самая поздняя дата). Ячейка G2 содержит формулу, которая возвращает самую последнюю дату из столбца с помощью функции MAX

Конечно, это можно изменить, чтобы вычислить самую последнюю дату в коде макроса. Хотя приятно видеть это на листе.

Как работает макрос?

Макрос сначала очищает все фильтры для поля сводки фильтра отчетов с помощью метода ClearAllFilters.

Затем он использует цикл For Next для циклического прохождения всех элементов сводки в поле сводки, чтобы применить фильтр. Каждый уникальный элемент в поле является основным элементом. Макрос проверяет, не соответствует ли имя элемента сводки (<>) критериям. Если нет, то он скрывает элемент или фильтрует его. В результате мы видим только критерии фильтра.

Как насчет фильтрации двух сводных таблиц за разные периоды времени?

Вот еще один пример с настройкой переменных в качестве параметров макроса. Это позволяет нам вызывать макрос из другого макроса.

 Sub Filter_PivotField_Args( _ sSheetName As String, _ sPivotName As String, _ sFieldName As String, _ sFilterCrit As String) ' Фильтрация сводной таблицы или среза по определенной дате или периоду Dim pi As PivotItem With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName) ' Очистить все фильтры основного поля .ClearAllFilters ' Проходить по элементам сводки поля сводки ' Скрыть или отфильтровать элементы, которые не соответствуют критериям For Each pi In .PivotItems If pi.Name <> sFilterCrit Then pi.Visible = False End If Next pi End With End Sub 
 Sub Filter_Multiple_Pivots() ' Вызвать макрос Filter Pivot для нескольких пивотов Dim sFilter1 As String Dim sFilter2 As String ' Установите критерии фильтра sFilter1 = ThisWorkbook.Worksheets("Data").Range("G2").Value sFilter2 = ThisWorkbook.Worksheets("Data").Range("G3").Value ' Вызовите макрос сводных фильтров, чтобы отфильтровать оба сводных Call Filter_PivotField_Args("2 Pivots", "PivotTable1", "Report Date", sFilter1) Call Filter_PivotField_Args("2 Pivots", "PivotTable2", "Report Date", sFilter2) End Sub 

В этом примере у нас есть лист с двумя сводными таблицами для сравнения неделя за неделей. Таким образом, нам нужно отфильтровать одну сводную таблицу для самой последней даты и одну для даты предыдущей недели.

Макрос Filter_Multiple_Pivots вызывает макрос Filter_PivotField_Args дважды. Обратите внимание, что имя сводной таблицы и значения критериев фильтрации различны для каждого вызова. Это простой способ многократно использовать макрос сводного поля фильтра без необходимости повторения большого количества кода.

Настройка: данные конвейера продаж CRM

В этом примере мы собираемся использовать данные о продажах. Таблица данных содержит еженедельные снимки или экспорт данных из системы CRM (Salesforces.com, Dynamics CRM, HubSpot и т.д.).

Для обновления данных мы экспортируем конвейерный отчет каждую неделю и вставляем данные в конец существующей таблицы. Есть и другие способы автоматизации этого процесса, но мы не будем вдаваться в подробности.

В наборе данных есть столбец «Дата отчета», в котором содержится дата запуска отчета для каждой строки. Вы можете видеть на изображении, что есть 4 набора данных, добавленных (сложенных) вместе, чтобы создать одну большую таблицу.

Сводная таблица показывает сводку доходов по этапам конвейера, а поле «Дата отчета» находится в области «Фильтры». Это позволяет нам фильтровать по любой дате отчета, чтобы увидеть сводную информацию о конвейере за эту неделю.

Когда новые данные добавляются в таблицу данных, мы хотим автоматически фильтровать все связанные сводные таблицы, диаграммы и срезы на последнюю дату отчета.

Как установить номер поля динамически

Если мы добавим / удалим / переместим столбцы в диапазоне фильтра, то номер поля для отфильтрованного столбца может измениться. Поэтому я стараюсь по возможности избегать жесткого кодирования числа для параметра Field.

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

 Sub Dynamic_Field_Number() 'Методы, чтобы найти и установить поле на основе имени столбца. Dim lo As ListObject Dim iCol As Long 'Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) 'Установить поле фильтра iCol = lo.ListColumns("Product").Index 'Использовать функцию соответствия для регулярных диапазонов 'iCol = WorksheetFunction.Match("Product", Sheet1.Range("B3:G3"), 0) 'Использовать переменную для значения параметра поля lo.Range.AutoFilter Field:=iCol, Criteria1:="Product 3" End Sub 

Номер столбца будет найден при каждом запуске макроса. Нам не нужно беспокоиться об изменении номера поля при перемещении столбца. Это экономит время и предотвращает ошибки (беспроигрышный вариант)!

Добавляем макрос фильтрации

Теперь надо добавить к текущему листу макрос фильтрации по критериям из созданного диапазона Условия. Для этого щелкните правой кнопкой мыши по ярлычку листа и выберите команду Исходный текст (Source text). В открывшееся окно редактора Visual Basic надо скопировать и вставить текст вот такого макроса:

Private Sub Worksheet_Change(ByVal Target As Range) Dim FilterCol As Integer Dim FilterRange As Range Dim CondtitionString As Variant Dim Condition1 As String, Condition2 As String If Intersect(Target, Range("Условия")) Is Nothing Then Exit Sub On Error Resume Next Application.ScreenUpdating = False 'определяем диапазон данных списка Set FilterRange = Target.Parent.AutoFilter.Range 'считываем условия из всех измененных ячеек диапазона условий For Each cell In Target.Cells FilterCol = cell.Column - FilterRange.Columns(1).Column + 1 If IsEmpty(cell) Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol Else If InStr(1, UCase(cell.Value), " ИЛИ ") > 0 Then LogicOperator = xlOr ConditionArray = Split(UCase(cell.Value), " ИЛИ ") Else If InStr(1, UCase(cell.Value), " И ") > 0 Then LogicOperator = xlAnd ConditionArray = Split(UCase(cell.Value), " И ") Else ConditionArray = Array(cell.Text) End If End If 'формируем первое условие If Left(ConditionArray(0), 1) = "<" Or Left(ConditionArray(0), 1) = ">" Then Condition1 = ConditionArray(0) Else Condition1 = "=" & ConditionArray(0) End If 'формируем второе условие - если оно есть If UBound(ConditionArray) = 1 Then If Left(ConditionArray(1), 1) = "<" Or Left(ConditionArray(1), 1) = ">" Then Condition2 = ConditionArray(1) Else Condition2 = "=" & ConditionArray(1) End If End If 'включаем фильтрацию If UBound(ConditionArray) = 0 Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1 Else Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1, _ Operator:=LogicOperator, Criteria2:=Condition2 End If End If Next cell Set FilterRange = Nothing Application.ScreenUpdating = True End Sub 

Все.

Теперь при вводе любых условий в желтые ячейки нашего именованного диапазона тут же будет срабатывать фильтрация, отображая только нужные нам строки и скрывая ненужные:

Как и в случае с классическими Автофильтром (Filter) и Расширенным фильтром (Advanced Filter), в нашем фильтре макросом можно смело использовать символы подстановки:

  • * (звездочка) – заменяет любое количество любых символов
  • ? (вопросительный знак) – заменяет один любой символ

и операторы логической связки:

  • И – выполнение обоих условий
  • ИЛИ – выполнение хотя бы одного из двух условий

и любые математические символы неравенства (>,<,=,>=,<=,<>).

При удалении содержимого ячеек желтого диапазона Условия автоматически снимается фильтрация с соответствующих столбцов.

Метод автофильтрации

Метод AutoFilter используется для очистки и применения фильтров к одному столбцу в диапазоне или таблице в VBA. Он автоматизирует процесс применения фильтров через выпадающие меню фильтров и делает, чтобы все работало.

Его можно использовать для применения фильтров к нескольким столбцам путем написания нескольких строк кода, по одной для каждого столбца. Мы также можем использовать Автофильтр, чтобы применить несколько критериев фильтрации к одному столбцу, так же, как в выпадающем меню фильтра, установив несколько флажков или указав диапазон дат.

Источники

  • https://excelpedia.ru/makrosi-v-excel/macros-filters-autofilter-method
  • https://www.planetaexcel.ru/techniques/3/137/
  • https://exceltable.com/vba-macros/makrosy-filtra-svodnoy-tablicy
  • https://excelpedia.ru/makrosi-v-excel/filtraciya-svodnoj-tablicy

Расширенный фильтр и немного магии

У подавляющего большинства пользователей Excel при слове «фильтрация данных» в голове всплывает только обычный классический фильтр с вкладки Данные — Фильтр (Data — Filter):

advanced-filter1.png

Такой фильтр — штука привычная, спору нет, и для большинства случаев вполне сойдет. Однако бывают ситуации, когда нужно проводить отбор по большому количеству сложных условий сразу по нескольким столбцам. Обычный фильтр тут не очень удобен и хочется чего-то помощнее. Таким инструментом может стать расширенный фильтр (advanced filter), особенно с небольшой «доработкой напильником» (по традиции).

Основа

Для начала вставьте над вашей таблицей с данными несколько пустых строк и скопируйте туда шапку таблицы — это будет диапазон с условиями (выделен для наглядности желтым):

advanced-filter2.png

Между желтыми ячейками и исходной таблицей обязательно должна быть хотя бы одна пустая строка.

Именно в желтые ячейки нужно ввести критерии (условия), по которым потом будет произведена фильтрация. Например, если нужно отобрать бананы в московский «Ашан» в III квартале, то условия будут выглядеть так:

advanced-filter3.png

Чтобы выполнить фильтрацию выделите любую ячейку диапазона с исходными данными, откройте вкладку Данные и нажмите кнопку Дополнительно (Data — Advanced). В открывшемся окне должен быть уже автоматически введен диапазон с данными и нам останется только указать диапазон условий, т.е. A1:I2:

advanced-filter5.png

Обратите внимание, что диапазон условий нельзя выделять «с запасом», т.е. нельзя выделять лишние пустые желтые строки, т.к. пустая ячейка в диапазоне условий воспринимается Excel как отсутствие критерия, а целая пустая строка — как просьба вывести все данные без разбора.

Переключатель Скопировать результат в другое место позволит фильтровать список не прямо тут же, на этом листе (как обычным фильтром), а выгрузить отобранные строки в другой диапазон, который тогда нужно будет указать в поле Поместить результат в диапазон. В данном случае мы эту функцию не используем, оставляем Фильтровать список на месте и жмем ОК. Отобранные строки отобразятся на листе:

advanced-filter6.png

Добавляем макрос

«Ну и где же тут удобство?» — спросите вы и будете правы. Мало того, что нужно руками вводить условия в желтые ячейки, так еще и открывать диалоговое окно, вводить туда диапазоны, жать ОК. Грустно, согласен! Но «все меняется, когда приходят они ©» — макросы!

Работу с расширенным фильтром можно в разы ускорить и упростить с помощью простого макроса, который будет автоматически запускать расширенный фильтр при вводе условий, т.е. изменении любой желтой ячейки. Щелкните правой кнопкой мыши по ярлычку текущего листа и выберите команду Исходный текст (Source Code). В открывшееся окно скопируйте и вставьте вот такой код:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A2:I5")) Is Nothing Then
        On Error Resume Next
        ActiveSheet.ShowAllData
        Range("A7").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("A1").CurrentRegion
    End If
End Sub

Эта процедура будет автоматически запускаться при изменении любой ячейки на текущем листе. Если адрес измененной ячейки попадает в желтый диапазон (A2:I5), то данный макрос снимает все фильтры (если они были) и заново применяет расширенный фильтр к таблице исходных данных, начинающейся с А7, т.е. все будет фильтроваться мгновенно, сразу после ввода очередного условия:

advanced-filter-work.gif

Так все гораздо лучше, правда? :)

Реализация сложных запросов

Теперь, когда все фильтруется «на лету», можно немного углубиться в нюансы и разобрать механизмы более сложных запросов в расширенном фильтре. Помимо ввода точных совпадений, в диапазоне условий можно использовать различные символы подстановки (* и ?) и знаки математических неравенств для реализации приблизительного поиска. Регистр символов роли не играет. Для наглядности я свел все возможные варианты в таблицу:

Критерий Результат
гр* или гр все ячейки начинающиеся с Гр, т.е. Груша, Грейпфрут, Гранат и т.д.
=лук все ячейки именно и только со словом Лук, т.е. точное совпадение
*лив* или *лив ячейки содержащие лив как подстроку, т.е. Оливки, Ливер, Залив и т.д.
=п*в слова начинающиеся с П и заканчивающиеся на В т.е. Павлов, Петров и т.д.
а*с слова начинающиеся с А и содержащие далее С, т.е. Апельсин, Ананас, Асаи и т.д.
=*с слова оканчивающиеся на С
=???? все ячейки с текстом из 4 символов (букв или цифр, включая пробелы)
=м??????н все ячейки с текстом из 8 символов, начинающиеся на М и заканчивающиеся на Н, т.е. Мандарин, Мангостин  и т.д.
=*н??а все слова оканчивающиеся на А, где 4-я с конца буква Н, т.е. Брусника, Заноза и т.д.
>=э все слова, начинающиеся с Э, Ю или Я
<>*о* все слова, не содержащие букву О
<>*вич все слова, кроме заканчивающихся на вич (например, фильтр женщин по отчеству)
= все пустые ячейки
<> все непустые ячейки
>=5000 все ячейки со значением больше или равно 5000
5 или =5 все ячейки со значением 5
>=3/18/2013 все ячейки с датой позже 18 марта 2013 (включительно)

Тонкие моменты:

  • Знак * подразумевает под собой любое количество любых символов, а ? — один любой символ.
  • Логика в обработке текстовых и числовых запросов немного разная. Так, например, ячейка условия с числом 5 не означает поиск всех чисел, начинающихся с пяти, но ячейка условия с буквой Б равносильна Б*, т.е. будет искать любой текст, начинающийся с буквы Б.
  • Если текстовый запрос не начинается со знака =, то в конце можно мысленно ставить *.
  • Даты надо вводить в штатовском формате месяц-день-год и через дробь (даже если у вас русский Excel и региональные настройки).

Логические связки И-ИЛИ

Условия записанные в разных ячейках, но в одной строке — считаются связанными между собой логическим оператором И (AND):

advanced-filter3.png

Т.е. фильтруй мне бананы именно в третьем квартале, именно по Москве и при этом из «Ашана».

Если нужно связать условия логическим оператором ИЛИ (OR), то их надо просто вводить в разные строки. Например, если нам нужно найти все заказы менеджера Волиной по московским персикам и все заказы по луку в третьем квартале по Самаре, то это можно задать в диапазоне условий следующим образом:

advanced-filter7.png

Если же нужно наложить два или более условий на один столбец, то можно просто продублировать заголовок столбца в диапазоне критериев и вписать под него второе, третье и т.д. условия. Вот так, например, можно отобрать все сделки с марта по май:

advanced-filter8.png

В общем и целом, после «доработки напильником» из расширенного фильтра выходит вполне себе приличный инструмент, местами не хуже классического автофильтра.

Ссылки по теме

  • Суперфильтр на макросах
  • Что такое макросы, куда и как вставлять код макросов на Visual Basic
  • Умные таблицы в Microsoft Excel

На чтение 11 мин. Просмотров 34.3k.

Итог: научиться создавать макросы, использовать фильтры на диапазоны и таблицы с помощью метода AutoFilter VBA. Статья содержит ссылки на примеры для фильтрации различных типов данных, включая текст, цифры, даты, цвета и значки.

Уровень мастерства: средний

Automate Filters with VBA Macros - AutoFilter Guide

Содержание

  1. Скачать файл
  2. Написание макросов для фильтров
  3. Макро-рекордер — твой друг (или враг)
  4. Метод автофильтрации
  5. Написание кода автофильтра
  6. Автофильтр не является дополнением
  7. Как установить номер поля динамически
  8. Используйте таблицы Excel с фильтрами
  9. Фильтры и типы данных
  10. Почему метод автофильтрации такой сложный?

Скачать файл

Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров.

VBA AutoFilters Guide.xlsm (100.5 KB)

Написание макросов для фильтров

Фильтры являются отличным инструментом для анализа данных в
Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются
частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для
применения фильтров к отдельным столбцам в наборе данных. Это помогает нам
связывать цифры с отчетами и проводить исследование наших данных.

How Often Do You Apply Excel Filters

Фильтрация также может быть трудоемким процессом. Особенно,
когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем
данные, чтобы затем копировать / вставлять их в другие листы или книги.

В этой статье объясняется, как создавать макросы для
автоматизации процесса фильтрации. Это обширное руководство по методу
автофильтра в VBA.

У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.

Макро-рекордер — твой друг (или враг)

Мы можем легко получить код VBA для фильтров, включив
макро-рекордер, а затем применив один или несколько фильтров к диапазону /
таблице.

Вот шаги для создания макроса фильтра с помощью устройства
записи макросов:

  1. Включите рекордер макросов:
    1. Вкладка «Разработчик»> «Запись макроса».
    2. Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
  2. Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
  3. Остановите рекордер.
  4. Откройте редактор VB (вкладка «Разработчик»> Visual Basic) для просмотра кода.

Если вы уже использовали макрос-рекордер для этого процесса,
то вы знаете, насколько он может быть полезен. Тем более, что наши критерии
фильтрации становятся более сложными.

Код будет выглядеть примерно так:

Sub Filters_Macro_Recorder()
'
' Filters_Macro_Recorder Macro
'

'
    ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4, Criteria1:= _
        "Product 2"
    ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4
    ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=5, Criteria1:= _
        ">=500", Operator:=xlAnd, Criteria2:="<=1000"
End Sub

Мы видим, что каждая строка использует метод AutoFilter для
применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Мы видим, что каждая строка использует метод AutoFilter для
применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Метод автофильтрации

Метод AutoFilter используется для очистки и применения
фильтров к одному столбцу в диапазоне или таблице в VBA. Он автоматизирует
процесс применения фильтров через выпадающие меню фильтров и делает, чтобы  все работало.

VBA AutoFilter Automates Filter Drop-down Menus

Его можно использовать для применения фильтров к нескольким
столбцам путем написания нескольких строк кода, по одной для каждого столбца.
Мы также можем использовать Автофильтр, чтобы применить несколько критериев
фильтрации к одному столбцу, так же, как в выпадающем меню фильтра, установив
несколько флажков или указав диапазон дат.

Написание кода автофильтра

Вот пошаговые инструкции по написанию строки кода для автофильтра.

Шаг 1: Ссылка на диапазон или таблицу

Метод AutoFilter является частью объекта Range. Поэтому мы
должны ссылаться на диапазон или таблицу, к которым применяются фильтры на
листе. Это будет весь диапазон, к которому применяются фильтры.

AutoFilter Method is Member of Range Object

Следующие примеры включают / отключают фильтры в диапазоне B3: G1000 на листе автофильтра.

Sub AutoFilter_Range()
'Автофильтр является членом объекта Range
  
  'Ссылка на весь диапазон, к которому применяются фильтры
  'Автофильтр включает / выключает фильтры, когда параметры не указаны.
  Sheet1.Range("B3:G1000").AutoFilter
  
  'Полностью квалифицированный справочник, начиная с уровня Workbook
  ThisWorkbook.Worksheets("AutoFilter Guide").Range("B3:G1000").AutoFilter

End Sub

Вот пример использования таблиц Excel.

Sub AutoFilter_Table()
'Автофильтры на таблицах работают одинаково.

Dim lo As ListObject 'Excel Table

  'Установить переменную ListObject (Table)
  Set lo = Sheet1.ListObjects(1)
  
  'Автофильтр является членом объекта Range
  'Родителем объекта Range является объект List
  lo.Range.AutoFilter
  
End Sub

Метод AutoFilter имеет 5 необязательных параметров, которые
мы рассмотрим далее. Если мы не укажем ни один из параметров, как в приведенных
выше примерах, метод AutoFilter включит / выключит фильтры для указанного
диапазона. Это переключение. Если фильтры включены, они будут выключены, и
наоборот.

Диапазоны или таблицы?

Фильтры работают одинаково как для обычных диапазонов, так и для таблиц
Excel
.

AutoFilter on Regular Range or Excel Table

Я отдаю предпочтение методу использования таблиц, потому что
нам не нужно беспокоиться об изменении ссылок на диапазон при увеличении или
уменьшении таблицы. Однако код будет одинаковым для обоих объектов. В остальных
примерах кода используются таблицы Excel, но вы можете легко изменить это для
обычных диапазонов.

5 (или 6) параметров автофильтра

Метод
AutoFilter имеет 5 (или 6) необязательных параметров, которые используются для
указания критериев фильтрации для столбца. Вот список параметров.

AutoFilter Parameters Optional Screentip in VB Editor VBA

Фильтры на VBA (AutoFilter Method) читать подробное руководство

Страница справки MSDN

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

Шаг 2: Параметр поля

Первый параметр — это Field. Для параметра Field мы указываем число, которое является номером столбца, к которому будет применяться фильтр. Это номер столбца в диапазоне фильтра, который является родителем метода AutoFilter. Это НЕ номер столбца на рабочем листе.

В приведенном ниже примере поле 4 является столбцом
«Продукт», поскольку это 4-й столбец в диапазоне фильтра / таблице.

Field Parameter Value is Column Number of the Range or Table

Фильтр столбца очищается, когда мы указываем только параметр
Field, а другие критерии отсутствуют.

Field Parameter Only Clears Single Column Filter

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

Шаг 3: Параметры критериев

Существует два параметра, которые можно использовать для указания фильтра Критерии, Criteria1 и Criteria2 . Мы используем комбинацию этих параметров и параметра Operator для разных типов фильтров. Здесь все становится сложнее, поэтому давайте начнем с простого примера.

'Фильтровать столбец «Продукт» для одного элемента
lo.Range.AutoFilter Field:=4, Criteria1:="Product 2"

Это то же самое, что выбрать один элемент из списка флажков в раскрывающемся меню фильтра.

VBA AutoFilter Code to Filter for Single Item in Filter Drop-down Menu

Общие правила для Criteria1 и Criteria2

Значения, которые мы указываем для Criteria1 и Criteria2,
могут быть хитрыми. Вот несколько общих рекомендаций о том, как ссылаться на
значения параметра Criteria.

  • Значением критерия является строка, заключенная в кавычки. Есть несколько исключений, когда критерии являются постоянными для периода времени даты и выше / ниже среднего.
  • При указании фильтров для отдельных чисел или дат форматирование чисел должно соответствовать форматированию чисел, применяемому в диапазоне / таблице.
  • Оператор сравнения больше / меньше чем также включен в кавычки перед числом.
  • Кавычки также используются для фильтров для пробелов «=» и не пробелов «<>».

General Rules for Criteria Parameters

'Фильтр на дату, большую или равную 1 января 2015 г.
lo.Range.AutoFilter Field:=1, Criteria1:=">=1/1/2015"

' Оператор сравнения> = находится внутри кавычек
' для параметра Criteria1.

' Форматирование даты в коде соответствует форматированию
' применяется к ячейкам на листе.

Шаг 4: Параметр оператора

Что если мы хотим выбрать несколько элементов из
раскрывающегося списка фильтров? Или сделать фильтр для диапазона дат или
чисел?

Для этого нам нужен Operator . Параметр Operator используется для указания типа фильтра, который мы хотим применить. Он может варьироваться в зависимости от типа данных в столбце. Для
Operator должна использоваться одна из следующих 11 констант.

Фильтры на VBA (AutoFilter Method) читать подробное руководство

Вот ссылка на страницу справки MSDN, которая содержит список констант для перечисления XlAutoFilterOperator.

Operator используется в сочетании с Criteria1 и / или Criteria2, в зависимости от типа данных и типа фильтра. Вот несколько примеров.

'Фильтр для списка нескольких элементов, оператор - xlFilterValues
lo.Range.AutoFilter _
          Field:=iCol, _
          Criteria1:=Array("Product 4", "Product 5", "Product 6"), _
          Operator:=xlFilterValues
'Фильтр для диапазона дат (между датами), оператор xlAnd
lo.Range.AutoFilter _
          Field:=iCol, _
          Criteria1:=">=1/1/2014", _
          Operator:=xlAnd, _
          Criteria2:="<=12/31/2015"

Это основы написания строки кода для метода AutoFilter. Будет сложнее с различными типами данных.

Итак, я привел много примеров ниже, которые содержат большинство комбинаций критериев и операторов для разных типов фильтров.

Автофильтр не является дополнением

При запуске строки кода автофильтра сначала удаляются все
фильтры, примененные к этому столбцу (полю), а затем применяются критерии
фильтра, указанные в строке кода.

Это означает, что это не дополнение. Следующие 2 строки НЕ создадут фильтр для Продукта 1 и Продукта 2. После запуска макроса столбец Продукт будет отфильтрован только для Продукта 2.

'Автофильтр НЕ ДОБАВЛЯЕТ. Это сначала любые фильтры, применяемые
'в столбце перед применением нового фильтра
lo.Range.AutoFilter Field:=4, Criteria1:="Product 3"
  
'Эта строка кода отфильтрует столбец только для продукта 2
'Фильтр для Продукта 3 выше будет очищен при запуске этой линии.
lo.Range.AutoFilter Field:=4, Criteria1:="Product 2"

Если вы хотите применить фильтр с несколькими критериями к одному столбцу, вы можете указать это с помощью параметров
Criteria и Operator .

Как установить номер поля динамически

Если мы добавим / удалим / переместим столбцы в диапазоне
фильтра, то номер поля для отфильтрованного столбца может измениться. Поэтому я
стараюсь по возможности избегать жесткого кодирования числа для параметра
Field.

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

Use Variable for Filter Field Column Number in VBA with Index Property

Sub Dynamic_Field_Number()
'Методы, чтобы найти и установить поле на основе имени столбца.
  
Dim lo As ListObject
Dim iCol As Long
  
  'Установить ссылку на первую таблицу на листе
  Set lo = Sheet1.ListObjects(1)
  
  'Установить поле фильтра
  iCol = lo.ListColumns("Product").Index
  
  'Использовать функцию соответствия для регулярных диапазонов
  'iCol = WorksheetFunction.Match("Product", Sheet1.Range("B3:G3"), 0)

  'Использовать переменную для значения параметра поля
  lo.Range.AutoFilter Field:=iCol, Criteria1:="Product 3"

End Sub

Номер столбца будет найден при каждом запуске макроса. Нам
не нужно беспокоиться об изменении номера поля при перемещении столбца. Это
экономит время и предотвращает ошибки (беспроигрышный вариант)!

Используйте таблицы Excel с фильтрами

Использование таблиц Excel дает множество преимуществ,
особенно при использовании метода автофильтрации. Вот несколько основных
причин, по которым я предпочитаю таблицы.

  • Нам не нужно переопределять диапазон в VBA, поскольку диапазон данных изменяет размер (строки / столбцы добавляются / удаляются). На всю таблицу ссылается объект ListObject.
  • Данные в таблице легко ссылаться после применения фильтров. Мы можем использовать свойство DataBodyRange для ссылки на видимые строки для копирования / вставки, форматирования, изменения значений и т.д.
  • Мы можем иметь несколько таблиц на одном листе и, следовательно, несколько диапазонов фильтров. С обычными диапазонами у нас может быть только один отфильтрованный диапазон на лист.
  • Код для очистки всех фильтров в таблице легче написать.

Фильтры и типы данных

Параметры раскрывающегося меню фильтра изменяются в
зависимости от типа данных в столбце. У нас есть разные фильтры для текста,
чисел, дат и цветов. Это создает МНОГО различных комбинаций операторов и
критериев для каждого типа фильтра.

Я создал отдельные посты для каждого из этих типов фильтров.
Посты содержат пояснения и примеры кода VBA.

  • Как очистить фильтры с помощью VBA
  • Как отфильтровать пустые и непустые клетки
  • Как фильтровать текст с помощью VBA
  • Как фильтровать числа с помощью VBA
  • Как отфильтровать даты с помощью VBA
  • Как отфильтровать цвета и значки с помощью VBA

Файл в разделе загрузок выше содержит все эти примеры кода в одном месте. Вы можете добавить его в свою личную книгу макросов и использовать макросы в своих проектах.

Почему метод автофильтрации такой сложный?

Этот пост был вдохновлен вопросом от Криса, участника The
VBA Pro Course. Комбинации Критерии и Операторы могут быть запутанными и
сложными. Почему это?

Ну, фильтры развивались на протяжении многих лет. Мы увидели много новых типов фильтров, представленных в Excel 2010, и эта функция продолжает улучшаться. Однако параметры метода автофильтра не изменились. Они отлично подходят для совместимости со старыми версиями, но также означает, что новые типы фильтров работают с существующими параметрами.

Большая часть кода фильтра имеет смысл, но сначала может быть
сложно разобраться. К счастью, у нас есть макро рекордер, чтобы помочь с этим.

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

excel data tableExcel VBA (Visual Basic for Application) is a powerful programming tool integrated with MS office suite. VBA has many constructs and methods that can be applied to manipulate data in an Excel worksheet (you can look up our introductory VBA tutorial to get a feel of all that VBA can do for you). AutoFilter in VBA is an important method that gives you the capability to filter worksheets and cells to selectively choose data.

Today, we will walk you through the AutoFilter in VBA. If you are new to  VBA, we suggest that you go through our basic Excel VBA tutorial.

AutoFilter is applicable to a column or a set of columns. It filters data depending on the given criteria. The syntax of Autofilter looks like this

expression .AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)

Where

  • Field- It is an integer offset of the field which contains the filter. The data type is variant, which means it can hold any data types – integers, strings, date and so on.
  • Criteria1- It’s a condition based on which columns are selected.
  • Operator- It specifies the type of filter. Some of the operators commonly used in Excel VBA programming are listed below.

Name

  Value

    Description

xlAnd

   1

  Logical AND of Criteria1 and Criteria2.

xlBottom10Items

   4

  Lowest-valued items displayed (number of items specified in Criteria1).

xlBottom10Percent

   6

  Lowest-valued items displayed (percentage specified in Criteria1).

xlFilterCellColor

   8

  Color of the cell

xlFilterDynamic

  11

  Dynamic filter

xlFilterFontColor

   9

  Color of the font

xlFilterIcon

  10

  Filter icon

xlFilterValues

   7

  Filter values

xlOr

   2

  Logical OR of Criteria1 or Criteria2.

xlTop10Items

   3

  Highest-valued items displayed (number of items specified in Criteria1).

xlTop10Percent

   5

  Highest-valued items displayed (percentage specified in Criteria1).

  • Criteria 2- This is the secondary condition based on which columns are selected. It’s combined with criteria1 and operator to create a compound criteria.
  •  VisibleDropDown- It’s true by default. It’s of data type variant. If it’s true then, the Autofilter dropDropDown arrow for the filtered field is displayed. If false, the dropDropDown arrow is hidden.

Now that you’re familiar with the concept and syntax of AutoFilter, lets move on to a few simple and practical exercises. Feel free to refer back to our VBA macros course at any point for more details.

 Example 1: To Close All Existing AutoFilters and Create New AutoFilters

 Sub AutoFilter1()
With ActiveSheet
           .AutoFilterMode = False
           .Range("A1:E1").AutoFilter
End With
End Sub

In this program .AutoFilterMode = false turns off any existing AutoFilters. Whereas .Range(“A1:E1”).AutoFilter creates an AutoFilter which is applicable to the range A1:E1 of the active worksheet.

From here on, we will reference a worksheet which has headings in the range A1: D1 and data in the range A1:D50. The headings are as follows:

 EmployeeName| E-age|Date of Joining| Department

Example 2: Using AutoFilter to match single criteria

 Sub FilterTo1Criteria()
With Sheet1
           .AutoFilterMode = False
        .Range("A1:D1").AutoFilter
           .Range("A1:D1").AutoFilter Field:=2, Criteria1:=40
End With
End Sub

This is a simple program which extracts rows where the age of the employees is 40. The “Field” value is 2 which means it refers to the second column which is ” E-age.”  Criteria is that the values in column 2 should be equal to 40.  Let’s take a look at the various types of criteria that you can include in your programs.

  • For instances where the E-age is 40 or more, you can use the following code
Criteria1:=">=40"
  • If you want to display the rows where E-age is blank, the code looks like this
Criteria1:="="
  •  To display all non-blanks we use
Criteria1:="<>"
  •  If you want to filter out the names starting with a letter “B”, in the Employee name field, then you have to assign the
Field := 1 and the Criteria1:="=B*"
  •  To display all names in the first column which do not contain a letter “e”, use the code
Criteria1:="<>*e*"
  •   If you want to hide the filter arrow then set VisibleDropDown:=False. This is the next argument after Criteria1

 Example 3: Using VBA AutoFilter to Filter out Two Matching Criteria

Sub MultipleCriteria()
With Sheet1
           .AutoFilterMode = False
           .Range("A1:D1").AutoFilter
           .Range("A1:D1").AutoFilter Field:=2, Criteria1:=">=30", _
        Operator:=xlAnd, Criteria2:="<=40"
End With
 End Sub

In this program, we have specified two criteria. The operator used is the “logical And” for the 2 criteria. Thus, only those records are selected where “e-age” is “>= 30” and “<=40.”

Example 4: Using Autofilter on two different fields

Sub Filter2Fields()
With Sheet1
           .AutoFilterMode = False
               With .Range("A1:D1")
                    .AutoFilter
                    .AutoFilter Field:=1, Criteria1:="John"
                .AutoFilter Field:=4, Criteria1:="Finance"
               End With
End With
End Sub

In this program, we have selected records where Employee Name is “john” whose department is “Finance.” It is possible to add more fields;  the condition being we should not exceed the total column count of headings, i.e. four.

Using Dates in AutoFilter

MS Excel uses the US date format. We recommend you to change your Date settings to this format. Else you have to use the DateSerial(). The syntax looks like this

DateSerial(year, month, day)

Let’s take a look at an example  that uses the data type Date to filter columns.

Example 5: Program to Filter by Date

Sub FilterDate1()
Dim Date1 As Date
Dim str_Date As String
 Dim l_Date As Long
Date1 = DateSerial(2010, 12, 1)
l_Date = Date1
   Range("A1").AutoFilter
   Range("A1").AutoFilter Field:=1, Criteria1:=">" & l_Date
End Sub

In this program, we declare Date1 as variable of type date, str_Date as variable of type string and l_Date of variable of type long. DateSerial() function converts the date passed to it into US date format. We use Autofilter to display records more recent than the given date (1/12/2010).

Using TimeSerial Function along with VBA Autofilter

TimeSerial() function returns the time in hours, minutes and seconds. The syntax looks like this

TimeSerial(hour, minute, second)

Let’s take a close  look at the parameters to understand them  better. All the three parameters require integer data type.

  • Hour: any number between 0 and 23 inclusive or a numeric expression.
  • Minute: any numeric expression.
  • Second: any numeric expression.

TimeSerial(17, 28, 20) will return the serial representation of 5: 28:20 PM. TimeSerial() can be used along with the DateSerial() to return the exact time and date in a VBA program.

 Example 5: Using Autofilter to Filter by Date and Time

 Sub FilterDateTime()
Dim d_Date As Date
Dim db_Date As Double
If IsDate(Range("B1")) Then
   db_Date = Range("B1")
db_Date = DateSerial(Year(db_Date), Month(db_Date), Day(db_Date)) + _
        TimeSerial(Hour(db_Date), Minute(db_Date), Second(db_Date))
   Range("A1").AutoFilter
    Range("A1").AutoFilter Field:=1, Criteria1:=">" & db_Date
End If
End Sub

In this program IsDate() is used to see whether the cell contains an expression that can be converted into a date. Then the content of the cell is assigned to the db_Date variable.  Next DateSerial() and TimeSerail () are combined and the result assigned to db_Date. We filter the records using Field 1 as criteria to return dates greater than db_Date.

Excel VBA is an exciting programming area. It equips you with features and functionalities to develop simple and efficient code. AutoFilter is central to Excel VBA programming. Leverage it to provide different views of the data. MrExcel shows some neat tricks in this VBA course, that can help you out. Once you’re ready to tackle more advanced usage, you can do so with our Ultimate VBA course.

Используя макросы, можно быстро и автоматически управлять структурой сводных таблиц. В данном примере будут описаны процессы фильтрации и скрытия столбцов значений в сводных отчетах Excel.

Как сделать фильтр в сводной таблице макросом

Чтобы получить данные для одного из 4-х магазинов фирмы, достаточно лишь открыть выпадающий список со всеми магазинами и выбрать один из них. Пример результата этих действий изображено на рисунке:

Тестовая сводная таблица.

Изменение настроек, которые доступны в интерактивных инструментах сводной таблице доступны так же на уровне программирования макросов из редактора VBA. Выбор магазина, который является элементом поля СТРАИЦЫ реализуется с помощью свойства CurrentPage.

Просто как параметр для этого свойства следует указать название поля. Например, напишем простой код макроса, который сам выберет «Магазин3» как критерий для фильтрования данных по оборотам в сводной таблице:

Sub Magazin3()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Магазины").CurrentPage = "Магазин 3"
End Sub

Чтобы создать такой макрос сначала откройте редактор VisualBasic (ALT+F11), а потом создайте новый модуль в редакторе: «Insert»-«Module» и введете в него выше указанный VBA-код:

VisualBasic.

Результат действия этого простого макроса такой же как выше рисунке, но без использования пользователем интерактивных инструментов сводной таблицы.

В методе PivotTables указан аргумент «ТаблицаМ» – это всего лишь ссылка на внутренне имя, которое было присвоено для сводной таблицы еще на этапе ее создания. Читайте пример создания где он детально описан: Макрос для создания сводной таблицы в Excel. Далее рассмотрим, как можно скрывать часть данных из области видимости значений.



Как скрыть столбец в сводном отчете макросом

Во многих ситуациях необходимо скрытие части данных, чтобы сосредоточить внимание аналитика на конкретно выбранной задачи или поставленной цели. Естественно сводная таблица обладает такой функцией без потери данных, а только лишь их визуальным скрытием. Чтобы скрыть в таблице данные за 2017 год с помощью макроса, введите в модуль следующий код:

Sub Hidden2017()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Год").PivotItems("2017").Visible = False
End Sub

Пример VBA-макроса в действии:

Пример VBA-макроса.

Чтобы снова включить (или сделать второй режим для переключателя скрыть/показать) в таблицу данные за 2017 год достаточно лишь в этом коде поменять параметр Fale на True.

Читайте также: Макрос позволяет рассчитать процент в сводной таблице Excel.

Безусловно после применения любых из выше описанных макросов, сводная таблица полностью сохраняет свою функциональность. Все также доступны все ее элементы управления и инструменты для настройки полей, фильтров, а также других опций.

Фильтры на VBA (AutoFilter Method): самое подробное руководство в рунете

Автор Дмитрий Якушев На чтение11 мин. Просмотров2.6k.

Итог: научиться создавать макросы, использовать фильтры на диапазоны и таблицы с помощью метода AutoFilter VBA. Статья содержит ссылки на примеры для фильтрации различных типов данных, включая текст, цифры, даты, цвета и значки.

Уровень мастерства: средний

Содержание

  1. Скачать файл
  2. Написание макросов для фильтров
  3. Макро-рекордер — твой друг (или враг)
  4. Метод автофильтрации
  5. Написание кода автофильтра
  6. Шаг 1: Ссылка на диапазон или таблицу
  7. Диапазоны или таблицы?
  8. 5 (или 6) параметров автофильтра
  9. Шаг 2: Параметр поля
  10. Шаг 3: Параметры критериев
  11. Общие правила дляCriteria1 и Criteria2
  12. Шаг 4: Параметр оператора
  13. Автофильтр не является дополнением
  14. Как установить номер поля динамически
  15. Используйте таблицы Excel с фильтрами
  16. Фильтры и типы данных
  17. Почему метод автофильтрации такой сложный?

Скачать файл

Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров.

VBA AutoFilters Guide.xlsm (100.5 KB)

Написание макросов для фильтров

Фильтры являются отличным инструментом для анализа данных в Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для применения фильтров к отдельным столбцам в наборе данных. Это помогает нам связывать цифры с отчетами и проводить исследование наших данных.

Фильтрация также может быть трудоемким процессом. Особенно, когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем данные, чтобы затем копировать / вставлять их в другие листы или книги.

В этой статье объясняется, как создавать макросы для автоматизации процесса фильтрации. Это обширное руководство по методу автофильтра в VBA.

У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.

Макро-рекордер — твой друг (или враг)

Мы можем легко получить код VBA для фильтров, включив макро-рекордер, а затем применив один или несколько фильтров к диапазону / таблице.

Вот шаги для создания макроса фильтра с помощью устройства записи макросов:

  1. Включите рекордер макросов:
    1. Вкладка «Разработчик»> «Запись макроса».
    2. Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
  2. Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
  3. Остановите рекордер.
  4. Откройте редактор VB (вкладка «Разработчик»> Visual Basic) для просмотра кода.

Если вы уже использовали макрос-рекордер для этого процесса, то вы знаете, насколько он может быть полезен. Тем более, что наши критерии фильтрации становятся более сложными.

Код будет выглядеть примерно так:

Sub Filters_Macro_Recorder()

‘ Filters_Macro_Recorder Macro

    ActiveSheet.ListObjects(«tblData»).Range.AutoFilter Field:=4, Criteria1:= _

        «Product 2»

    ActiveSheet.ListObjects(«tblData»).Range.AutoFilter Field:=4

    ActiveSheet.ListObjects(«tblData»).Range.AutoFilter Field:=5, Criteria1:= _

        «>=500″, Operator:=xlAnd, Criteria2:=»<=1000»

End Sub

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Метод автофильтрации

Метод AutoFilter используется для очистки и применения фильтров к одному столбцу в диапазоне или таблице в VBA. Он автоматизирует процесс применения фильтров через выпадающие меню фильтров и делает, чтобы  все работало.

Его можно использовать для применения фильтров к нескольким столбцам путем написания нескольких строк кода, по одной для каждого столбца. Мы также можем использовать Автофильтр, чтобы применить несколько критериев фильтрации к одному столбцу, так же, как в выпадающем меню фильтра, установив несколько флажков или указав диапазон дат.

Написание кода автофильтра

Вот пошаговые инструкции по написанию строки кода для автофильтра.

Шаг 1: Ссылка на диапазон или таблицу

Метод AutoFilter является частью объекта Range. Поэтому мы должны ссылаться на диапазон или таблицу, к которым применяются фильтры на листе. Это будет весь диапазон, к которому применяются фильтры.

Следующие примеры включают / отключают фильтры в диапазоне B3: G1000 на листе автофильтра.

Sub AutoFilter_Range()

‘Автофильтр является членом объекта Range

  ‘Ссылка на весь диапазон, к которому применяются фильтры

  ‘Автофильтр включает / выключает фильтры, когда параметры не указаны.

  Sheet1.Range(«B3:G1000»).AutoFilter

  ‘Полностью квалифицированный справочник, начиная с уровня Workbook

  ThisWorkbook.Worksheets(«AutoFilter Guide»).Range(«B3:G1000»).AutoFilter

End Sub

Вот пример использования таблиц Excel.

Sub AutoFilter_Table()

‘Автофильтры на таблицах работают одинаково.

Dim lo As ListObject ‘Excel Table

  ‘Установить переменную ListObject (Table)

  Set lo = Sheet1.ListObjects(1)

  ‘Автофильтр является членом объекта Range

  ‘Родителем объекта Range является объект List

  lo.Range.AutoFilter

End Sub

Метод AutoFilter имеет 5 необязательных параметров, которые мы рассмотрим далее. Если мы не укажем ни один из параметров, как в приведенных выше примерах, метод AutoFilter включит / выключит фильтры для указанного диапазона. Это переключение. Если фильтры включены, они будут выключены, и наоборот.

Диапазоны или таблицы?

Фильтры работают одинаково как для обычных диапазонов, так и для таблиц Excel.

Я отдаю предпочтение методу использования таблиц, потому что нам не нужно беспокоиться об изменении ссылок на диапазон при увеличении или уменьшении таблицы. Однако код будет одинаковым для обоих объектов. В остальных примерах кода используются таблицы Excel, но вы можете легко изменить это для обычных диапазонов.

5 (или 6) параметров автофильтра

Метод AutoFilter имеет 5 (или 6) необязательных параметров, которые используются для указания критериев фильтрации для столбца. Вот список параметров.

Страница справки MSDN

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

Шаг 2: Параметр поля

Первый параметр — это Field. Для параметра Field мы указываем число, которое является номером столбца, к которому будет применяться фильтр. Это номер столбца в диапазоне фильтра, который является родителем метода AutoFilter. Это НЕ номер столбца на рабочем листе.

В приведенном ниже примере поле 4 является столбцом «Продукт», поскольку это 4-й столбец в диапазоне фильтра / таблице.

Фильтр столбца очищается, когда мы указываем только параметр Field, а другие критерии отсутствуют.

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

Шаг 3: Параметры критериев

Существует два параметра, которые можно использовать для указания фильтра Критерии, Criteria1 и Criteria2 . Мы используем комбинацию этих параметров и параметра Operator для разных типов фильтров. Здесь все становится сложнее, поэтому давайте начнем с простого примера.

‘Фильтровать столбец «Продукт» для одного элемента

lo.Range.AutoFilter Field:=4, Criteria1:=»Product 2″

Это то же самое, что выбрать один элемент из списка флажков в раскрывающемся меню фильтра.

Общие правила для Criteria1 и Criteria2

Значения, которые мы указываем для Criteria1 и Criteria2, могут быть хитрыми. Вот несколько общих рекомендаций о том, как ссылаться на значения параметра Criteria.

  • Значением критерия является строка, заключенная в кавычки. Есть несколько исключений, когда критерии являются постоянными для периода времени даты и выше / ниже среднего.
  • При указании фильтров для отдельных чисел или дат форматирование чисел должно соответствовать форматированию чисел, применяемому в диапазоне / таблице.
  • Оператор сравнения больше / меньше чем также включен в кавычки перед числом.
  • Кавычки также используются для фильтров для пробелов «=» и не пробелов «<>».

‘Фильтр на дату, большую или равную 1 января 2015 г.

lo.Range.AutoFilter Field:=1, Criteria1:=»>=1/1/2015″

‘ Оператор сравнения> = находится внутри кавычек

‘ для параметра Criteria1.

‘ Форматирование даты в коде соответствует форматированию

‘ применяется к ячейкам на листе.

Шаг 4: Параметр оператора

Что если мы хотим выбрать несколько элементов из раскрывающегося списка фильтров? Или сделать фильтр для диапазона дат или чисел?

Для этого нам нужен Operator . Параметр Operator используется для указания типа фильтра, который мы хотим применить. Он может варьироваться в зависимости от типа данных в столбце. Для
Operator должна использоваться одна из следующих 11 констант.

Вот ссылка на страницу справки MSDN, которая содержит список констант для перечисления XlAutoFilterOperator .

Operator используется в сочетании с Criteria1 и / или Criteria2, в зависимости от типа данных и типа фильтра. Вот несколько примеров.

‘Фильтр для списка нескольких элементов, оператор — xlFilterValues

lo.Range.AutoFilter _

          Field:=iCol, _

          Criteria1:=Array(«Product 4», «Product 5», «Product 6»), _

          Operator:=xlFilterValues

‘Фильтр для диапазона дат (между датами), оператор xlAnd

lo.Range.AutoFilter _

          Field:=iCol, _

          Criteria1:=»>=1/1/2014″, _

          Operator:=xlAnd, _

          Criteria2:=»<=12/31/2015″

Это основы написания строки кода для метода AutoFilter. Будет сложнее с различными типами данных.

Итак, я привел много примеров ниже, которые содержат большинство комбинаций критериев и операторов для разных типов фильтров.

Автофильтр не является дополнением

При запуске строки кода автофильтра сначала удаляются все фильтры, примененные к этому столбцу (полю), а затем применяются критерии фильтра, указанные в строке кода.

Это означает, что это не дополнение. Следующие 2 строки НЕ создадут фильтр для Продукта 1 и Продукта 2. После запуска макроса столбец Продукт будет отфильтрован только для Продукта 2.

‘Автофильтр НЕ ДОБАВЛЯЕТ. Это сначала любые фильтры, применяемые

‘в столбце перед применением нового фильтра

lo.Range.AutoFilter Field:=4, Criteria1:=»Product 3″

‘Эта строка кода отфильтрует столбец только для продукта 2

‘Фильтр для Продукта 3 выше будет очищен при запуске этой линии.

lo.Range.AutoFilter Field:=4, Criteria1:=»Product 2″

Если вы хотите применить фильтр с несколькими критериями к одному столбцу, вы можете указать это с помощью параметров
Criteria и Operator .

Как установить номер поля динамически

Если мы добавим / удалим / переместим столбцы в диапазоне фильтра, то номер поля для отфильтрованного столбца может измениться. Поэтому я стараюсь по возможности избегать жесткого кодирования числа для параметра Field.

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

Sub Dynamic_Field_Number()

‘Методы, чтобы найти и установить поле на основе имени столбца.

Dim lo As ListObject

Dim iCol As Long

  ‘Установить ссылку на первую таблицу на листе

  Set lo = Sheet1.ListObjects(1)

  ‘Установить поле фильтра

  iCol = lo.ListColumns(«Product»).Index

  ‘Использовать функцию соответствия для регулярных диапазонов

  ‘iCol = WorksheetFunction.Match(«Product», Sheet1.Range(«B3:G3»), 0)

  ‘Использовать переменную для значения параметра поля

  lo.Range.AutoFilter Field:=iCol, Criteria1:=»Product 3″

End Sub

Номер столбца будет найден при каждом запуске макроса. Нам не нужно беспокоиться об изменении номера поля при перемещении столбца. Это экономит время и предотвращает ошибки (беспроигрышный вариант)!

Используйте таблицы Excel с фильтрами

Использование таблиц Excel дает множество преимуществ, особенно при использовании метода автофильтрации. Вот несколько основных причин, по которым я предпочитаю таблицы.

  • Нам не нужно переопределять диапазон в VBA, поскольку диапазон данных изменяет размер (строки / столбцы добавляются / удаляются). На всю таблицу ссылается объект ListObject.
  • Данные в таблице легко ссылаться после применения фильтров. Мы можем использовать свойство DataBodyRange для ссылки на видимые строки для копирования / вставки, форматирования, изменения значений и т.д.
  • Мы можем иметь несколько таблиц на одном листе и, следовательно, несколько диапазонов фильтров. С обычными диапазонами у нас может быть только один отфильтрованный диапазон на лист.
  • Код для очистки всех фильтров в таблице легче написать.

Фильтры и типы данных

Параметры раскрывающегося меню фильтра изменяются в зависимости от типа данных в столбце. У нас есть разные фильтры для текста, чисел, дат и цветов. Это создает МНОГО различных комбинаций операторов и критериев для каждого типа фильтра.

Я создал отдельные посты для каждого из этих типов фильтров. Посты содержат пояснения и примеры кода VBA.

  • Как очистить фильтры с помощью VBA
  • Как отфильтровать пустые и непустые клетки
  • Как фильтровать текст с помощью VBA
  • Как фильтровать числа с помощью VBA
  • Как отфильтровать даты с помощью VBA
  • Как отфильтровать цвета и значки с помощью VBA

Файл в разделе загрузок выше содержит все эти примеры кода в одном месте. Вы можете добавить его в свою личную книгу макросов и использовать макросы в своих проектах.

Почему метод автофильтрации такой сложный?

Этот пост был вдохновлен вопросом от Криса, участника The VBA Pro Course. Комбинации Критерии и Операторы могут быть запутанными и сложными. Почему это?

Ну, фильтры развивались на протяжении многих лет. Мы увидели много новых типов фильтров, представленных в Excel 2010, и эта функция продолжает улучшаться. Однако параметры метода автофильтра не изменились. Они отлично подходят для совместимости со старыми версиями, но также означает, что новые типы фильтров работают с существующими параметрами.

Большая часть кода фильтра имеет смысл, но сначала может быть сложно разобраться. К счастью, у нас есть макро рекордер, чтобы помочь с этим.

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

Источник

Содержание

  • Синтаксис автофильтра Excel VBA
  • Включение и выключение автофильтра Excel с помощью VBA
  • Убедитесь, что автофильтр уже применен
  • Показать все данные
  • Использование автофильтра на защищенных листах

Многие функции Excel также доступны для использования в VBA — и Автофильтр метод — одна из таких функций.

Если у вас есть набор данных, и вы хотите отфильтровать его по критерию, вы можете легко сделать это с помощью параметра «Фильтр» на ленте «Данные».

А если вам нужна более продвинутая версия, в Excel также есть расширенный фильтр.

Тогда зачем даже использовать автофильтр в VBA?

Если вам просто нужно отфильтровать данные и выполнить некоторые базовые действия, я бы рекомендовал придерживаться встроенных функций фильтра, которые предлагает интерфейс Excel.

Вам следует использовать VBA Autofilter, если вы хотите фильтровать данные как часть вашей автоматизации (или если это помогает вам сэкономить время, ускоряя фильтрацию данных).

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

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

В таком сценарии использование VBA Autofilter может ускорить работу и сэкономить время.

Примечание: Я расскажу об этом примере (о фильтрации данных на основе раскрывающегося списка и копировании на новый лист) позже в этом руководстве.

Выражение. Автофильтр (_Field_, _Criteria1_, _Operator_, _Criteria2_, _VisibleDropDown_)
  • Выражение: Это диапазон, к которому вы хотите применить автоматический фильтр.
  • Поле: [Необязательный аргумент] Это номер столбца, который вы хотите отфильтровать. Это считается слева в наборе данных. Поэтому, если вы хотите отфильтровать данные на основе второго столбца, это значение будет 2.
  • Критерии1: [Необязательный аргумент] Это критерии, на основе которых вы хотите отфильтровать набор данных.
  • Оператор: [Необязательный аргумент] Если вы также используете критерий 2, вы можете объединить эти два критерия на основе Оператора. Для использования доступны следующие операторы: xlAnd, xlOr, xlBottom10Items, xlTop10Items, xlBottom10Percent, xlTop10Percent, xlFilterCellColor, xlFilterDynamic, xlFilterFontColor, xlFilterIcon, xlFilterValues
  • Критерии2: [Необязательный аргумент] Это второй критерий, по которому вы можете фильтровать набор данных.
  • VisibleDropDown: [Необязательный аргумент] Вы можете указать, хотите ли вы, чтобы раскрывающийся значок фильтра отображался в отфильтрованных столбцах или нет. Этот аргумент может иметь значение ИСТИНА или ЛОЖЬ.

Все остальные аргументы, кроме Expression, необязательны.

Если вы не используете какой-либо аргумент, он просто применяет или удаляет значки фильтра к столбцам.

Sub FilterRows () Worksheets («Фильтр данных»). Диапазон («A1»). AutoFilter End Sub

Приведенный выше код просто применит метод автофильтра к столбцам (или, если он уже применен, удалит его).

Это просто означает, что если вы не видите значки фильтра в заголовках столбцов, вы начнете видеть его, когда будет выполнен приведенный выше код, и если вы его увидите, он будет удален.

Если у вас есть отфильтрованные данные, он удалит фильтры и покажет вам полный набор данных.

Теперь давайте посмотрим на несколько примеров использования Excel VBA Autofilter, которые прояснят его использование.

Пример: фильтрация данных на основе текстового условия

Предположим, у вас есть набор данных, показанный ниже, и вы хотите отфильтровать его на основе столбца «Элемент».

В приведенном ниже коде будут отфильтрованы все строки, в которых элементом является «Принтер».

Sub FilterRows () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 2, Criteria1: = "Printer" End Sub

Приведенный выше код относится к Sheet1, а внутри него — к A1 (которая является ячейкой в ​​наборе данных).

Обратите внимание, что здесь мы использовали Field: = 2, поскольку столбец элемента — это второй столбец в нашем наборе данных слева.

Теперь, если вы думаете — зачем мне это делать с помощью кода VBA. Это легко сделать с помощью встроенного фильтра.

Ты прав!

Если это все, что вы хотите сделать, лучше использовать встроенную функцию фильтра.

Но когда вы прочитаете оставшееся руководство, вы увидите, что его можно объединить с некоторым дополнительным кодом для создания мощной автоматизации.

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

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

Пример: несколько критериев (И / ИЛИ) в одном столбце

Предположим, у меня есть тот же набор данных, и на этот раз я хочу отфильтровать все записи, в которых элементом является «Принтер» или «Проектор».

Следующий код сделает это:

Sub FilterRowsOR () Рабочие листы ("Sheet1"). Диапазон ("A1"). Поле автофильтра: = 2, Criteria1: = "Printer", Operator: = xlOr, Criteria2: = "Projector" End Sub

Обратите внимание, что здесь я использовал XLOR оператор.

Это указывает VBA использовать оба критерия и фильтровать данные, если выполняется какой-либо из двух критериев.

Точно так же вы также можете использовать критерий И.

Например, если вы хотите отфильтровать все записи, в которых количество больше 10, но меньше 20, вы можете использовать следующий код:

Sub FilterRowsAND () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 4, Criteria1: = "> 10", _ Operator: = xlAnd, Criteria2: = "<20" End Sub

Пример: несколько критериев с разными столбцами

Предположим, у вас есть следующий набор данных.

С помощью автофильтра вы можете фильтровать несколько столбцов одновременно.

Например, если вы хотите отфильтровать все записи, где элемент — «Принтер», а торговый представитель — «Отметка», вы можете использовать следующий код:

Sub FilterRows () с листами ("Sheet1"). Range ("A1") .AutoFilter field: = 2, Criteria1: = "Printer" .AutoFilter field: = 3, Criteria1: = "Mark" End with End Sub

Пример: отфильтровать 10 лучших записей с помощью метода автофильтрации

Предположим, у вас есть следующий набор данных.

Ниже приведен код, который предоставит вам 10 лучших записей (на основе столбца количества):

Sub FilterRowsTop10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlTop10Items End Sub

В приведенном выше коде я использовал ActiveSheet. Вы можете использовать имя листа, если хотите.

Обратите внимание, что в этом примере, если вы хотите получить 5 лучших элементов, просто измените число в Criteria1: = ”10 ″ с 10 до 5.

Итак, для топ-5 элементов код будет следующим:

Sub FilterRowsTop5 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "5", оператор: = xlTop10Items End Sub

Это может выглядеть странно, но независимо от того, сколько топовых элементов вы хотите, значение Operator всегда остается xlTop10Items.

Точно так же приведенный ниже код даст вам 10 нижних элементов:

Sub FilterRowsBottom10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlBottom10Items End Sub

А если вам нужны 5 нижних элементов, измените число в Criteria1: = ”10 ″ с 10 до 5.

Пример: отфильтруйте 10 процентов лучших с помощью метода автофильтрации

Предположим, у вас есть тот же набор данных (который использовался в предыдущих примерах).

Ниже приведен код, который предоставит вам первые 10 процентов записей (в зависимости от столбца количества):

Sub FilterRowsTop10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlTop10Percent End Sub

В нашем наборе данных, поскольку у нас есть 20 записей, он вернет 2 верхние записи (что составляет 10% от общего числа записей).

Пример: использование подстановочных знаков в автофильтре

Предположим, у вас есть набор данных, как показано ниже:

Если вы хотите отфильтровать все строки, в названии которых есть слово «Доска», вы можете использовать следующий код:

Sub FilterRowsWildcard () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 2, Criteria1: = "* Board *" End Sub

В приведенном выше коде я использовал подстановочный знак * (звездочку) до и после слова «Доска» (которое является критерием).

Звездочка может представлять любое количество символов. Таким образом, это отфильтрует любой элемент, в котором есть слово «доска».

Пример: копирование отфильтрованных строк на новый лист

Если вы хотите не только фильтровать записи на основе критериев, но и копировать отфильтрованные строки, вы можете использовать следующий макрос.

Он копирует отфильтрованные строки, добавляет новый лист, а затем вставляет эти скопированные строки в новый лист.

Sub CopyFilteredRows () Dim rng As Range Dim ws As Worksheet If Worksheets ("Sheet1"). AutoFilterMode = False Then MsgBox "Нет отфильтрованных строк" Выйти из Sub End, если установлено rng ​​= Worksheets ("Sheet1"). AutoFilter.Range Set ws = Worksheets.Add rng.Copy Range ("A1") End Sub

Приведенный выше код проверяет, есть ли отфильтрованные строки в Sheet1 или нет.

Если нет отфильтрованных строк, отобразится сообщение об этом.

И если есть отфильтрованные строки, он скопирует их, вставит новый рабочий лист и вставит эти строки на этот только что вставленный рабочий лист.

Пример: фильтрация данных на основе значения ячейки

Используя автофильтр в VBA вместе с раскрывающимся списком, вы можете создать функцию, в которой, как только вы выберете элемент из раскрывающегося списка, все записи для этого элемента будут отфильтрованы.

Что-то вроде того, что показано ниже:

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

Этот тип конструкции может быть полезен, когда вы хотите быстро отфильтровать данные, а затем использовать их в дальнейшей работе.

Ниже приведен код, который это сделает:

Private Sub Worksheet_Change (ByVal Target As Range) Если Target.Address = "$ B $ 2", то если Range ("B2") = "All", то диапазон ("A5"). AutoFilter Else Range ("A5"). AutoFilter Field : = 2, Criteria1: = Range ("B2") End If End If End Sub

Это код события рабочего листа, который выполняется только тогда, когда на листе есть изменение, а целевая ячейка — B2 (где у нас есть раскрывающийся список).

Кроме того, условие If Then Else используется для проверки, выбрал ли пользователь «Все» в раскрывающемся списке. Если выбрано «Все», отображается весь набор данных.

Этот код НЕ помещается в модуль.

Вместо этого его нужно поместить в серверную часть рабочего листа, на котором есть эти данные.

Вот шаги, чтобы поместить этот код в окно кода рабочего листа:

  1. Откройте редактор VB (сочетание клавиш — ALT + F11).
  2. На панели Project Explorer дважды щелкните имя рабочего листа, в котором вы хотите использовать эту функцию фильтрации.
  3. В окне кода рабочего листа скопируйте и вставьте приведенный выше код.
  4. Закройте редактор VB.

Теперь, когда вы используете раскрывающийся список, он автоматически фильтрует данные.

Это код события рабочего листа, который выполняется только тогда, когда на листе есть изменение, а целевая ячейка — B2 (где у нас есть раскрывающийся список).

Кроме того, условие If Then Else используется для проверки, выбрал ли пользователь «Все» в раскрывающемся списке. Если выбрано «Все», отображается весь набор данных.

Включение и выключение автофильтра Excel с помощью VBA

При применении автофильтра к диапазону ячеек некоторые фильтры могут уже быть на месте.

Вы можете использовать приведенный ниже код, чтобы отключить любые предварительно примененные автоматические фильтры:

Sub TurnOFFAutoFilter () Worksheets ("Sheet1"). AutoFilterMode = False End Sub

Этот код проверяет все листы и удаляет все примененные фильтры.

Если вы не хотите отключать фильтры для всего листа, а только для определенного набора данных, используйте следующий код:

Sub TurnOFFAutoFilter () Если рабочие листы ("Sheet1"). Range ("A1"). AutoFilter Then Worksheets ("Sheet1"). Range ("A1"). AutoFilter End If End Sub

Приведенный выше код проверяет, установлены ли уже фильтры или нет.

Если фильтры уже применены, он их удаляет, иначе ничего не делает.

Точно так же, если вы хотите включить автофильтр, используйте следующий код:

Sub TurnOnAutoFilter (), если не рабочие листы ("Sheet1"). Range ("A4"). AutoFilter Then Worksheets ("Sheet1"). Range ("A4"). AutoFilter End If End Sub

Убедитесь, что автофильтр уже применен

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

Sub CheckforFilters () Если ActiveSheet.AutoFilterMode = True Then MsgBox "Фильтры уже установлены" Else MsgBox "Фильтры отсутствуют" End If End Sub

Этот код использует функцию окна сообщения, которая отображает сообщение «Фильтры уже установлены», когда он находит фильтры на листе, в противном случае он показывает «Нет фильтров».

Показать все данные

Если у вас есть фильтры, примененные к набору данных, и вы хотите показать все данные, используйте приведенный ниже код:

Sub ShowAllData () Если ActiveSheet.FilterMode, то ActiveSheet.ShowAllData End Sub

Приведенный выше код проверяет, имеет ли FilterMode значение TRUE или FALSE.

Если это правда, это означает, что был применен фильтр и он использует метод ShowAllData для отображения всех данных.

Обратите внимание, что это не удаляет фильтры. Значки фильтров по-прежнему доступны для использования.

Использование автофильтра на защищенных листах

По умолчанию, когда вы защищаете лист, фильтры не работают.

Если у вас уже есть фильтры, вы можете включить автофильтр, чтобы убедиться, что он работает даже на защищенных листах.

Для этого отметьте опцию Использовать автофильтр при защите листа.

Хотя это работает, когда у вас уже есть фильтры, если вы попытаетесь добавить автофильтры с помощью кода VBA, это не сработает.

Поскольку лист защищен, он не позволит запускать какие-либо макросы и вносить изменения в автофильтр.

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

Это может быть полезно, когда вы создали динамический фильтр (то, что я рассмотрел в примере — «Фильтровать данные на основе значения ячейки»).

Ниже приведен код, который защитит лист, но в то же время позволит вам использовать в нем фильтры, а также макросы VBA.

Private Sub Workbook_Open () With Worksheets ("Sheet1") .EnableAutoFilter = True .Protect Password: = "password", Contents: = True, UserInterfaceOnly: = True End with End Sub

Этот код необходимо поместить в окно кода ThisWorkbook.

Вот шаги, чтобы поместить код в окно кода ThisWorkbook:

  1. Откройте редактор VB (сочетание клавиш — ALT + F11).
  2. На панели Project Explorer дважды щелкните объект ThisWorkbook.
  3. В открывшемся окне кода скопируйте и вставьте приведенный выше код.

Как только вы откроете книгу и включите макросы, он автоматически запустит макрос и защитит Sheet1.

Однако перед этим он укажет EnableAutoFilter = True, что означает, что фильтры будут работать и на защищенном листе.

Кроме того, он устанавливает для аргумента UserInterfaceOnly значение True. Это означает, что пока рабочий лист защищен, код макроса VBA будет продолжать работать.

Вам также могут понравиться следующие руководства по VBA:

  • Циклы Excel VBA.
  • Отфильтруйте ячейки с полужирным шрифтом.
  • Запись макроса.
  • Сортировка данных с помощью VBA.
  • Сортировка вкладок рабочего листа в Excel.

Фильтрация одномерного массива в VBA Excel с помощью функции Filter. Синтаксис и параметры функции Filter. Пример фильтрации одномерного массива.

Filter – это функция, которая возвращает массив, содержащий строки исходного одномерного массива, соответствующие заданным условиям фильтрации.

Примечания

  • исходный (фильтруемый) массив должен быть одномерным и содержать строки;
  • индексация возвращенного массива начинается с нуля;
  • возвращенный массив содержит ровно столько элементов, сколько строк исходного массива соответствуют заданным условиям фильтрации;
  • переменная, которой присваивается возвращенный массив, должна быть универсального типа (As Variant) и объявлена не как массив (не myArray() со скобками, а myArray без скобок).

Функция Filter автоматически преобразует обычную переменную универсального типа, которой присваивается отфильтрованный список, в одномерный массив с необходимым количеством элементов.

Синтаксис

Filter(sourcearray, match, [include], [compare])

Параметры

Параметр Описание
sourcearray Обязательный параметр. Одномерный массив, элементы которого требуется отфильтровать
match Обязательный параметр. Искомая строка.
include Необязательный параметр. Значение Boolean, которое указывает:

  • True – возвращаются строки, содержащие match (значение по умолчанию);
  • False – возвращаются строки, не содержащие match.
compare Необязательный параметр. Числовое значение (константа), указывающее тип сравнения строк. По умолчанию – 0 (vbBinaryCompare).

Compare (значения)

Параметр compare может принимать следующие значения:

Константа Значение Описание
vbUseCompareOption -1 используется тип сравнения, заданный оператором Option Compare
vbBinaryCompare 0 выполняется двоичное сравнение (регистр имеет значение)
vbTextCompare 1 выполняется текстовое сравнение (без учета регистра)

Пример фильтрации

Фильтрация списка в столбце «A» по словам, начинающимся с буквы «К», и загрузка результатов в столбец «B»:

Пример кода VBA Excel с функцией Filter:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Sub Primer()

    Dim arr1, arr2, arr3, i As Long

    ‘Присваиваем переменной arr1 массив значений столбца A

    arr1 = Range(«A1:A» & Range(«A1»).End(xlDown).Row)

    ‘Копируем строки двумерного массива arr1 в одномерный arr2

    ReDim arr2(1 To UBound(arr1))

        For i = 1 To UBound(arr1)

            arr2(i) = arr1(i, 1)

        Next

    ‘Фильтруем строки массива arr2 по вхождению подстроки «К»

    ‘и присваиваем отфильтрованные строки переменной arr3

    arr3 = Filter(arr2, «К»)

    ‘Копируем строки из массива arr3 в столбец «B»

        For i = 0 To UBound(arr3)

            Cells(i + 1, 2) = arr3(i)

        Next

End Sub

Понравилась статья? Поделить с друзьями:
  • Excel макрос для удаления лишних пробелов
  • Excel макрос для удаления дубликатов
  • Excel макрос для удаления всех макросов в книге
  • Excel макрос для транслитерации
  • Excel макрос для сравнения таблица