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

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

advanced-filter1.png

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

Основа

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

advanced-filter2.png

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

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

advanced-filter3.png

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

advanced-filter5.png

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

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

advanced-filter6.png

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

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

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

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

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

advanced-filter-work.gif

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

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

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

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

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

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

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

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

advanced-filter3.png

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

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

advanced-filter7.png

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

advanced-filter8.png

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

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



Страницы: 1  2  3  4  
23.05.2019 17:41:52
Николай, спасибо за фильтр. не подскажите как можно вывести ячейки за исключением тех которые содержат слова имя или телефон или дата?
29.08.2019 09:13:49
Добрый день!
В данном примере представлен макрос для Расширенного фильтра БЕЗ копирования результата в другое место.
Подскажите, что нужно добавить в макрос для копирования результата в другой диапазон того же листа?
09.09.2019 14:59:01
Добрый день!
Очень крутой метод! Спасибо большое!
Но есть у меня один момент, возможно кто-то сможет мне помочь в полной мере реализовать данный фильтр.
Я фильтрую по одной колонке но у меня там очень большие наименования:
Например:
01010003006 Заклепка АЛ/СТ з пл. гол. 3,0x6, ALFA RAL 9016 01010BM3006 уп.500 шт.
Можно ли реализовать фильтрацию по типу "Содержит И....... И......", а не или по одной колонке?
т.е. я хочу найти все позиции "АЛ/СТ" в цвете "RAL 9016"
В данном примере он не применяет одно условие ко второму, показывает все "АЛ/СТ" и все позиции в цвете "RAL 9016"
Заранее спасибо.
27.09.2019 08:53:29
Добрый день.

Спасибо за способ - мне помог. Подпилил немного для себя, всё работает.

Единственный момент: хочу скрыть строку с условиями фильтра, т.к. фильтрую только по одному параметру, и хочу сделать на другую ячейку. То есть меняю значение в другой ячейке, меняется ячейка в диапазоне условий, срабатывает фильтр. У меня почему-то обычная сслыка не работает, само значение меняется в ячейке, но макрос отфильтровывает не по значению, а по содержанию, т.е. по самой ссылке, в моём случае это "=J2", и в итоге у меня пустой вывод фильтра.

Может быть кто-нибудь сможет подсказать, как исправить?
04.10.2019 19:48:48
Как можно отфильтровать числа в одном столбце с условием "И", допустим <3 И >1 ? Создание 2го столбца для этой цели невозможно.
04.12.2022 23:10:09
читать коментарии с начала
29.01.2020 00:10:58
Николай, спасибо за фильтр. Помогло.
Подскажи пожалуйста. А возможно вывести предыдущий поиск в фильтре ?
15.10.2020 10:55:46
Отличная фишка, но...
А если применить эти фильтры к сводной таблице, а не к обычному массиву?
Он не хочет фильтровать по заголовку сводной, а пытается фильтровать по первой строке сводной таблицы (т.е где начинается настройка фильтров- левая верхняя часть сводной).
А так как там заголовки не соответствуют заголовкам условий (логично), то такой метод фильтрации не применим.
Как быть?, если это возможно

Почему спрашиваю и почему мне это необходимо.
Мне часто приходится делать доп расчеты за пределами сводной таблицы (точнее olap куба) и как раз фильтр  больше приходится применять на этот диапазон
06.12.2020 23:55:47
А что убрать в коде, чтобы он не скрывал строки?
15.12.2020 13:10:20
Добрый день, Николай!
Успешно использовал ваш инструмент на одном из своих док-ов, все исправно работало, пытаюсь сделать на другом, что-то работает некорректно, почему только первые несколько колонн реагируют т.к нужно и фильтрация происходит, а остальные столбцы ни в какую, диапазоны вроде правильно раскинул, но все, что происходит- это пропадают все строки. Помогите, пожалуйста, разобраться.
04.12.2022 23:12:00
было тоже самое
помогло привести в порядок форматы ячеек
Формат ячейки критериев фильтра и фильтруемого поля должны совпадать!!!! ( это обязательное правило и для других полей)
22.01.2021 12:08:10
Здравствуйте.
Макрос замечательно работает, но возник вопрос: в моей большой книге используется стиль ячеек R1C1, как правильно переписать макрос в этом стиле.
Пробовал так:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("R2C1:R4C19")) Is Nothing Then
        On Error Resume Next
        ActiveSheet.ShowAllData
        Range("R7C1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("R1C1").CurrentRegion
    End If
End Sub
Выдает ошибку.
15.04.2021 18:48:50
В 2016 excel получилось отфильтровать даты только в формате дд/мм/гггг, причем и день и месяц меньше 10 без ноля в начале... т.е. 1 апреля 2021 это 1/4/2021. Другими форматами отказывался правильно отображать.
04.12.2022 23:09:15
везде так фильтр дат работает в американском формате даты при задании условий, если хочется фильтровать равно, то задайте формат для дат как строчные данные.
Формат ячейки критериев фильтра и фильтруемого поля должны совпадать!!!! ( это обязательное правило и для других полей)
16.08.2021 19:00:08
Добрый день!
Помогите пожалуйста в решении небольшой задачи, сижу уже четвертый день и ни чего не могу придумать. Работаю в MS Office 2016.
Во вложении направляю файл, в котором сама суть задачи.
На листе "Список", в ячейке С2 имеется выпадающий список, на основании которого фильтруется список продукции, которую необходимо отражать на листе "Отчет" в общем отчете.
Если я выбираю ООО Ромашка, из выпадающего списка, то на листе Отчет необходимо, что бы в общем дашборде выпадал перечень продукции который реализует именно ООО Ромашка.
Пример необходимого дашборда представлен на листе "Отчет_Пример".
Важно, что бы при изменении в выпадающем списке на листе Список, автоматически менялись компании в дашборде в блоке выручка и себестоимось на закладке Отчет.
Много всего пробовал сделать, в итоге все перенес в чистый файл, что бы мне помогли с вопросом на сайте планета эксель.
Ссылка на файл:
https://drive.google.com/file/d/1MHtVWYG_TSNoq91BEwot9nU9k-7W3ZF5/view?usp=sharing



Спасибо Вам, добрые люди!
17.08.2021 17:23:15
Помогите пожалуйста. Оч важный момент.
20.08.2021 15:08:09
Добрый день.не работает фильтр по числам и не все строки высвечивает на ЛЮБУЮ букву
20.08.2021 15:12:21



Не работает еще по номеру если начинает на 7 + Не все строки высвечивает с одинаковым адресом.  
21.08.2021 10:18:15
Добрый день!!  Не работает макрос по вашему примеру. Помогите пожалуйста.

https://docs.google.com/spreadsheets/d/1CdPR_9uA3ANgrDRkBIz6MvQMHVeVNvpO/edit?usp=sharing&ouid=112032784313549513284&rtpof=true&sd=true
23.08.2021 18:04:31
Добрый день, не подскажете как множественное отрицание реализовать? Например что бы город не содержал "мос" и "сам" в любом месте.


'<>*мос*

'<>*сам*

не работают вместе в разных строчках, только по отдельности
01.10.2021 15:15:27
а как задать критерий в столбце сумма, например,  от 1000 до 6000, по одному менеджеру?
13.11.2021 08:19:26
Не работает макрос с умной таблицей. Есть какие-то особенности или ограничения?
15.12.2021 15:18:34
Для умной таблицы. Необходимые диапазоны выставите сами, либо создадите тему на форуме, Вам помогут.

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("F3:W4")) Is Nothing Then
            Dim lo As ListObject
            Set lo = ActiveWorkbook.Worksheets("Ваш лист").ListObjects("Ваша таблица")
        
            On Error Resume Next
                With Application:
                    .ScreenUpdating = False
                    .Calculation = xlCalculationManual
                End With

                lo.AutoFilter.ShowAllData
                If Not Intersect(Target, Range("F4:W4")) Is Nothing Then
                    lo.Range.CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
                    CriteriaRange:=Range("F2:W4")
                Else
                    lo.Range.CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
                    CriteriaRange:=Range("F2:W3")
                End If
            
                Set lo = Nothing
                With Application:
                    .Calculation = xlCalculationAutomatic
                    .ScreenUpdating = True
                End With
    End If
            
End Sub
19.01.2022 05:31:25
Эксель - это ебаный кал для долбоебов. Нихуя не работает. Билл Гейтс, пошел нахуй.8-)8-)8-)
30.11.2022 10:01:29
А можно ли применить данный фильтр к нескольким таблицам на листе? Находящимся друг под другом....
23.05.2023 17:42:24
Николай, здравствуйте
фильтр классный, но есть одно ограничение у него, он ищет только по первому слову, а все остальные игнорирует. Можно ли как то подкорректировать, чтобы он искал по всей строке в ячейке?
04.06.2024 10:34:48
фильтр классный
Николай, спасибо!
19.12.2024 12:34:13
Николай добрый день.
Спасибо за классыный фильрт, очень помогли.
У меня есть такой вопрос, прошу помогите.
Есть ячейка, откуда через выпадающий список выбирается название товарной группы, эта же ячейка связана (является источником) с полем условия расширенного фильтра. Предполагается, что в данной ячейке выбирается товарная группа, и она ссылкой идет в поле расширенного фильтра, и таблица фильтруется. Но вот проблема: фильтр не срабатывает, когда выбираю ячейку и она автоматом подставляется в условие фильтра. Когда руками встаю в ячейку с условием и формулой и нажимаю Enter, то срабатывает, а когда выбираю, то не работает. Получается, что условие фильтра не реагирует на изменение состава ячейки согласно формулы?
Возможно ли что-то здесь исправить?

Спасибо за ранее.
08.02.2025 16:24:03
Здравствуйте Николай!

Все сделал по вашим примерам, но фильтр не выводит наименовании на 13ти тысячной строке.
Почему?
19.03.2025 15:46:24
Здравствуйте, Николай! Очень хороший пример (как всегда)! Буду очень признателен, если подскажете как сделать, чтобы фильтр немедленно реагировал на ввод каждого символа в ячейке (не дожидаясь нажатия enter).
Спасибо!
Страницы: 1  2  3  4  
Наверх