Многие функции Excel также доступны для использования в VBA - и Автофильтр метод - одна из таких функций.
Если у вас есть набор данных, и вы хотите отфильтровать его по критерию, вы можете легко сделать это с помощью параметра «Фильтр» на ленте «Данные».
А если вам нужна более продвинутая версия, в Excel также есть расширенный фильтр.
Тогда зачем даже использовать автофильтр в VBA?
Если вам просто нужно отфильтровать данные и выполнить некоторые базовые действия, я бы рекомендовал придерживаться встроенных функций фильтра, которые предлагает интерфейс Excel.
Вам следует использовать VBA Autofilter, если вы хотите фильтровать данные как часть вашей автоматизации (или если это помогает вам сэкономить время, ускоряя фильтрацию данных).
Например, предположим, что вы хотите быстро отфильтровать данные на основе раскрывающегося списка, а затем скопировать эти отфильтрованные данные на новый рабочий лист.
Хотя это можно сделать с помощью встроенных функций фильтра вместе с копипастом, это может занять много времени, чтобы сделать это вручную.
В таком сценарии использование VBA Autofilter может ускорить работу и сэкономить время.
Примечание: Я расскажу об этом примере (о фильтрации данных на основе раскрывающегося списка и копировании на новый лист) позже в этом руководстве.
Синтаксис автофильтра Excel VBA
Выражение. Автофильтр (_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 используется для проверки, выбрал ли пользователь «Все» в раскрывающемся списке. Если выбрано «Все», отображается весь набор данных.
Этот код НЕ помещается в модуль.
Вместо этого его нужно поместить в серверную часть рабочего листа, на котором есть эти данные.
Вот шаги, чтобы поместить этот код в окно кода рабочего листа:
- Откройте редактор VB (сочетание клавиш - ALT + F11).
- На панели Project Explorer дважды щелкните имя рабочего листа, в котором вы хотите использовать эту функцию фильтрации.
- В окне кода рабочего листа скопируйте и вставьте приведенный выше код.
- Закройте редактор 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:
- Откройте редактор VB (сочетание клавиш - ALT + F11).
- На панели Project Explorer дважды щелкните объект ThisWorkbook.
- В открывшемся окне кода скопируйте и вставьте приведенный выше код.
Как только вы откроете книгу и включите макросы, он автоматически запустит макрос и защитит Sheet1.
Однако перед этим он укажет EnableAutoFilter = True, что означает, что фильтры будут работать и на защищенном листе.
Кроме того, он устанавливает для аргумента UserInterfaceOnly значение True. Это означает, что пока рабочий лист защищен, код макроса VBA будет продолжать работать.
Вам также могут понравиться следующие руководства по VBA:
- Циклы Excel VBA.
- Отфильтруйте ячейки с полужирным шрифтом.
- Запись макроса.
- Сортировка данных с помощью VBA.
- Сортировка вкладок рабочего листа в Excel.