Фильтрация одномерного массива в VBA Excel с помощью функции Filter. Синтаксис и параметры функции Filter. Пример фильтрации одномерного массива.
Filter – это функция, которая возвращает массив, содержащий строки исходного одномерного массива, соответствующие заданным условиям фильтрации.
Примечания
- исходный (фильтруемый) массив должен быть одномерным и содержать строки;
- индексация возвращенного массива начинается с нуля;
- возвращенный массив содержит ровно столько элементов, сколько строк исходного массива соответствуют заданным условиям фильтрации;
- переменная, которой присваивается возвращенный массив, должна быть универсального типа (As Variant) и объявлена не как массив (не myArray() со скобками, а myArray без скобок).
Функция Filter автоматически преобразует обычную переменную универсального типа, которой присваивается отфильтрованный список, в одномерный массив с необходимым количеством элементов.
Синтаксис
Filter(sourcearray, match, [include], [compare]) |
Параметры
Параметр | Описание |
---|---|
sourcearray | Обязательный параметр. Одномерный массив, элементы которого требуется отфильтровать |
match | Обязательный параметр. Искомая строка. |
include | Необязательный параметр. Значение Boolean, которое указывает:
|
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 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.
На чтение 11 мин. Просмотров 34.4k.
Итог: научиться создавать макросы, использовать фильтры на диапазоны и таблицы с помощью метода AutoFilter VBA. Статья содержит ссылки на примеры для фильтрации различных типов данных, включая текст, цифры, даты, цвета и значки.
Уровень мастерства: средний
Содержание
- Скачать файл
- Написание макросов для фильтров
- Макро-рекордер — твой друг (или враг)
- Метод автофильтрации
- Написание кода автофильтра
- Автофильтр не является дополнением
- Как установить номер поля динамически
- Используйте таблицы Excel с фильтрами
- Фильтры и типы данных
- Почему метод автофильтрации такой сложный?
Скачать файл
Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров.
VBA AutoFilters Guide.xlsm (100.5 KB)
Написание макросов для фильтров
Фильтры являются отличным инструментом для анализа данных в
Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются
частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для
применения фильтров к отдельным столбцам в наборе данных. Это помогает нам
связывать цифры с отчетами и проводить исследование наших данных.
Фильтрация также может быть трудоемким процессом. Особенно,
когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем
данные, чтобы затем копировать / вставлять их в другие листы или книги.
В этой статье объясняется, как создавать макросы для
автоматизации процесса фильтрации. Это обширное руководство по методу
автофильтра в VBA.
У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.
Макро-рекордер — твой друг (или враг)
Мы можем легко получить код VBA для фильтров, включив
макро-рекордер, а затем применив один или несколько фильтров к диапазону /
таблице.
Вот шаги для создания макроса фильтра с помощью устройства
записи макросов:
- Включите рекордер макросов:
- Вкладка «Разработчик»> «Запись макроса».
- Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
- Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
- Остановите рекордер.
- Откройте редактор 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 в качестве руководства по написанию макросов для фильтров. Автоматизация фильтров может сэкономить нам и нашим пользователям массу времени, особенно при использовании этих методов в более крупном проекте автоматизации данных.
Стандартный Автофильтр для выборки из списков — вещь, безусловно, привычная и надежная. Но для создания сложных условий приходится выполнить не так уж мало действий. Например, чтобы отфильтровать значения попадающие в интервал от 100 до 200, необходимо развернуть список Автофильтра мышью, выбрать вариант Условие (Custom), а в новых версиях Excel: Числовые фильтры — Настраиваемый фильтр (Number filters — Custom filter). Затем в диалоговом окне задать два оператора сравнения, значения и логическую связку (И-ИЛИ) между ними:
Не так уж и долго, скажут некоторые. Да, но если в день приходится повторять эту процедуру по нескольку десятков раз? Выход есть — альтернативный фильтр с помощью макроса, который будет брать значения критериев отбора прямо из ячеек листа, куда мы их просто введем с клавиатуры. По сути, это будет похоже на расширенный фильтр, но работающий в реальном времени. Чтобы реализовать такую штуку, нам потребуется сделать всего два шага:
Шаг 1. Именованный диапазон для условий
Сначала надо создать именованный диапазон, куда мы будем вводить условия, и откуда макрос их будет брать. Для этого можно прямо над таблицей вставить пару-тройку пустых строк, затем выделить ячейки для будущих критериев (на рисунке это A2:F2) и дать им имя Условия, вписав его в поле имени в левом верхнем углу и нажав клавишу Enter. Для наглядности, я выделил эти ячейки желтым цветом:
Шаг 2. Добавляем макрос фильтрации
Теперь надо добавить к текущему листу макрос фильтрации по критериям из созданного диапазона Условия. Для этого щелкните правой кнопкой мыши по ярлычку листа и выберите команду Исходный текст (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), в нашем фильтре макросом можно смело использовать символы подстановки:
- * (звездочка) — заменяет любое количество любых символов
- ? (вопросительный знак) — заменяет один любой символ
и операторы логической связки:
- И — выполнение обоих условий
- ИЛИ — выполнение хотя бы одного из двух условий
и любые математические символы неравенства (>,<,=,>=,<=,<>).
При удалении содержимого ячеек желтого диапазона Условия автоматически снимается фильтрация с соответствующих столбцов.
P.S.
- Если у вас Excel 2007 или 2010 не забудьте сохранить файл с поддержкой макросов (в формате xlsm), иначе добавленный макрос умрет.
- Данный макрос не умеет работать с «умными таблицами»
Ссылки по теме
- Что такое макросы, куда вставлять код макроса на VBA, как их использовать?
- Умные таблицы Excel 2007/2010
- Расширенный фильтр и немного магии
Vlad999, огромное спасибо за код! Искал в точности именно это, потому и нашел.
Но насчет идеальной работы.. А даты тоже фильтруются? У меня почему-то нет. Более того, вообще цифры не работают. Даже если поменять стиль ячеек на текстовый!
Зарегистрировался чтобы спросить об этом
Можете помочь, пожалуйста?
Добавлено через 9 минут
UPDATED — все-таки в текстовом режиме работает. Не обновил значения после смены формата. Но даты никак не получается задействовать… Можно их тоже в виде текста набирать, конечно — но это, согласитесь, немного не то.
P.s. Еще раз благодарю за то, что уже работает. Они еще и по нескольким колонкам, и с пустыми ячейками… Это прекрасно