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 с листом «Лист1». Лист представляет собой таблицу, которая имеет автофильтрацию (данные>фильтр>автофильтр).
В ячейке А1 есть некое значение «значение».
По приведенному выше коду, при запуске макрос фильтрует таблицу по первому столбцу в режиме «равно», подставляя значение ячейки A1 (в нашем случае это слово «значение»). В результате скрываются все строки, значения первых ячеек которых не равно слову «значение».

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

Моя задача изменить код таким образом, чтобы макрос работал не в режиме «равно», а в режиме «содержит». То есть первые ячейки должны строк должны содержать значение, указанное в ячейке A1.

В простом варианте код макроса выглядит как

Visual Basic
1
2
    Sheets("Лист1").Select
    Selection.AutoFilter Field:=1, Criteria1:="=*значение*", Operator:=xlAnd

Необходимо вместо конкретного «значения» использовать переменную, значение которой макрос берез из ячейки A1.
Как должен выглядеть такой код?

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 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 (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 макрос длина строки
  • Excel макрос диапазон чисел
  • Excel макрос диапазон строк
  • Excel макрос диалоговое окно с выбором
  • Excel макрос диалоговое окно да нет