Расширенный фильтр и немного магии
У подавляющего большинства пользователей Excel при слове "фильтрация данных" в голове всплывает только обычный классический фильтр с вкладки Данные - Фильтр (Data - Filter):
Такой фильтр - штука привычная, спору нет, и для большинства случаев вполне сойдет. Однако бывают ситуации, когда нужно проводить отбор по большому количеству сложных условий сразу по нескольким столбцам. Обычный фильтр тут не очень удобен и хочется чего-то помощнее. Таким инструментом может стать расширенный фильтр (advanced filter), особенно с небольшой "доработкой напильником" (по традиции).
Основа
Для начала вставьте над вашей таблицей с данными несколько пустых строк и скопируйте туда шапку таблицы - это будет диапазон с условиями (выделен для наглядности желтым):
Между желтыми ячейками и исходной таблицей обязательно должна быть хотя бы одна пустая строка.
Именно в желтые ячейки нужно ввести критерии (условия), по которым потом будет произведена фильтрация. Например, если нужно отобрать бананы в московский "Ашан" в III квартале, то условия будут выглядеть так:
Чтобы выполнить фильтрацию выделите любую ячейку диапазона с исходными данными, откройте вкладку Данные и нажмите кнопку Дополнительно (Data - Advanced). В открывшемся окне должен быть уже автоматически введен диапазон с данными и нам останется только указать диапазон условий, т.е. A1:I2:
Обратите внимание, что диапазон условий нельзя выделять "с запасом", т.е. нельзя выделять лишние пустые желтые строки, т.к. пустая ячейка в диапазоне условий воспринимается Excel как отсутствие критерия, а целая пустая строка - как просьба вывести все данные без разбора.
Переключатель Скопировать результат в другое место позволит фильтровать список не прямо тут же, на этом листе (как обычным фильтром), а выгрузить отобранные строки в другой диапазон, который тогда нужно будет указать в поле Поместить результат в диапазон. В данном случае мы эту функцию не используем, оставляем Фильтровать список на месте и жмем ОК. Отобранные строки отобразятся на листе:
Добавляем макрос
"Ну и где же тут удобство?" - спросите вы и будете правы. Мало того, что нужно руками вводить условия в желтые ячейки, так еще и открывать диалоговое окно, вводить туда диапазоны, жать ОК. Грустно, согласен! Но "все меняется, когда приходят они ©" - макросы!
Работу с расширенным фильтром можно в разы ускорить и упростить с помощью простого макроса, который будет автоматически запускать расширенный фильтр при вводе условий, т.е. изменении любой желтой ячейки. Щелкните правой кнопкой мыши по ярлычку текущего листа и выберите команду Исходный текст (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, т.е. все будет фильтроваться мгновенно, сразу после ввода очередного условия:
Так все гораздо лучше, правда? :)
Реализация сложных запросов
Теперь, когда все фильтруется "на лету", можно немного углубиться в нюансы и разобрать механизмы более сложных запросов в расширенном фильтре. Помимо ввода точных совпадений, в диапазоне условий можно использовать различные символы подстановки (* и ?) и знаки математических неравенств для реализации приблизительного поиска. Регистр символов роли не играет. Для наглядности я свел все возможные варианты в таблицу:
Критерий | Результат |
гр* или гр | все ячейки начинающиеся с Гр, т.е. Груша, Грейпфрут, Гранат и т.д. |
=лук | все ячейки именно и только со словом Лук, т.е. точное совпадение |
*лив* или *лив | ячейки содержащие лив как подстроку, т.е. Оливки, Ливер, Залив и т.д. |
=п*в | слова начинающиеся с П и заканчивающиеся на В т.е. Павлов, Петров и т.д. |
а*с | слова начинающиеся с А и содержащие далее С, т.е. Апельсин, Ананас, Асаи и т.д. |
=*с | слова оканчивающиеся на С |
=???? | все ячейки с текстом из 4 символов (букв или цифр, включая пробелы) |
=м??????н | все ячейки с текстом из 8 символов, начинающиеся на М и заканчивающиеся на Н, т.е. Мандарин, Мангостин и т.д. |
=*н??а | все слова оканчивающиеся на А, где 4-я с конца буква Н, т.е. Брусника, Заноза и т.д. |
>=э | все слова, начинающиеся с Э, Ю или Я |
<>*о* | все слова, не содержащие букву О |
<>*вич | все слова, кроме заканчивающихся на вич (например, фильтр женщин по отчеству) |
= | все пустые ячейки |
<> | все непустые ячейки |
>=5000 | все ячейки со значением больше или равно 5000 |
5 или =5 | все ячейки со значением 5 |
>=3/18/2013 | все ячейки с датой позже 18 марта 2013 (включительно) |
Тонкие моменты:
- Знак * подразумевает под собой любое количество любых символов, а ? - один любой символ.
- Логика в обработке текстовых и числовых запросов немного разная. Так, например, ячейка условия с числом 5 не означает поиск всех чисел, начинающихся с пяти, но ячейка условия с буквой Б равносильна Б*, т.е. будет искать любой текст, начинающийся с буквы Б.
- Если текстовый запрос не начинается со знака =, то в конце можно мысленно ставить *.
- Даты надо вводить в штатовском формате месяц-день-год и через дробь (даже если у вас русский Excel и региональные настройки).
Логические связки И-ИЛИ
Условия записанные в разных ячейках, но в одной строке - считаются связанными между собой логическим оператором И (AND):
Т.е. фильтруй мне бананы именно в третьем квартале, именно по Москве и при этом из "Ашана".
Если нужно связать условия логическим оператором ИЛИ (OR), то их надо просто вводить в разные строки. Например, если нам нужно найти все заказы менеджера Волиной по московским персикам и все заказы по луку в третьем квартале по Самаре, то это можно задать в диапазоне условий следующим образом:
Если же нужно наложить два или более условий на один столбец, то можно просто продублировать заголовок столбца в диапазоне критериев и вписать под него второе, третье и т.д. условия. Вот так, например, можно отобрать все сделки с марта по май:
В общем и целом, после "доработки напильником" из расширенного фильтра выходит вполне себе приличный инструмент, местами не хуже классического автофильтра.
Ссылки по теме
- Суперфильтр на макросах
- Что такое макросы, куда и как вставлять код макросов на Visual Basic
- Умные таблицы в Microsoft Excel
В данном примере представлен макрос для Расширенного фильтра БЕЗ копирования результата в другое место.
Подскажите, что нужно добавить в макрос для копирования результата в другой диапазон того же листа?
Очень крутой метод! Спасибо большое!
Но есть у меня один момент, возможно кто-то сможет мне помочь в полной мере реализовать данный фильтр.
Я фильтрую по одной колонке но у меня там очень большие наименования:
Например:
т.е. я хочу найти все позиции "АЛ/СТ" в цвете "RAL 9016"
В данном примере он не применяет одно условие ко второму, показывает все "АЛ/СТ" и все позиции в цвете "RAL 9016"
Заранее спасибо.
Спасибо за способ - мне помог. Подпилил немного для себя, всё работает.
Единственный момент: хочу скрыть строку с условиями фильтра, т.к. фильтрую только по одному параметру, и хочу сделать на другую ячейку. То есть меняю значение в другой ячейке, меняется ячейка в диапазоне условий, срабатывает фильтр. У меня почему-то обычная сслыка не работает, само значение меняется в ячейке, но макрос отфильтровывает не по значению, а по содержанию, т.е. по самой ссылке, в моём случае это "=J2", и в итоге у меня пустой вывод фильтра.
Может быть кто-нибудь сможет подсказать, как исправить?
Подскажи пожалуйста. А возможно вывести предыдущий поиск в фильтре ?
А если применить эти фильтры к сводной таблице, а не к обычному массиву?
Он не хочет фильтровать по заголовку сводной, а пытается фильтровать по первой строке сводной таблицы (т.е где начинается настройка фильтров- левая верхняя часть сводной).
А так как там заголовки не соответствуют заголовкам условий (логично), то такой метод фильтрации не применим.
Как быть?, если это возможно
Почему спрашиваю и почему мне это необходимо.
Мне часто приходится делать доп расчеты за пределами сводной таблицы (точнее olap куба) и как раз фильтр больше приходится применять на этот диапазон
Успешно использовал ваш инструмент на одном из своих док-ов, все исправно работало, пытаюсь сделать на другом, что-то работает некорректно, почему только первые несколько колонн реагируют т.к нужно и фильтрация происходит, а остальные столбцы ни в какую, диапазоны вроде правильно раскинул, но все, что происходит- это пропадают все строки. Помогите, пожалуйста, разобраться.
помогло привести в порядок форматы ячеек
Формат ячейки критериев фильтра и фильтруемого поля должны совпадать!!!! ( это обязательное правило и для других полей)
Макрос замечательно работает, но возник вопрос: в моей большой книге используется стиль ячеек R1C1, как правильно переписать макрос в этом стиле.
Пробовал так:
Формат ячейки критериев фильтра и фильтруемого поля должны совпадать!!!! ( это обязательное правило и для других полей)
Помогите пожалуйста в решении небольшой задачи, сижу уже четвертый день и ни чего не могу придумать. Работаю в MS Office 2016.
Во вложении направляю файл, в котором сама суть задачи.
На листе "Список", в ячейке С2 имеется выпадающий список, на основании которого фильтруется список продукции, которую необходимо отражать на листе "Отчет" в общем отчете.
Если я выбираю ООО Ромашка, из выпадающего списка, то на листе Отчет необходимо, что бы в общем дашборде выпадал перечень продукции который реализует именно ООО Ромашка.
Пример необходимого дашборда представлен на листе "Отчет_Пример".
Важно, что бы при изменении в выпадающем списке на листе Список, автоматически менялись компании в дашборде в блоке выручка и себестоимось на закладке Отчет.
Много всего пробовал сделать, в итоге все перенес в чистый файл, что бы мне помогли с вопросом на сайте планета эксель.
Ссылка на файл:
Спасибо Вам, добрые люди!
Не работает еще по номеру если начинает на 7 + Не все строки высвечивает с одинаковым адресом.
'<>*мос*
'<>*сам*
не работают вместе в разных строчках, только по отдельности
фильтр классный, но есть одно ограничение у него, он ищет только по первому слову, а все остальные игнорирует. Можно ли как то подкорректировать, чтобы он искал по всей строке в ячейке?
Николай, спасибо!
Спасибо за классыный фильрт, очень помогли.
У меня есть такой вопрос, прошу помогите.
Есть ячейка, откуда через выпадающий список выбирается название товарной группы, эта же ячейка связана (является источником) с полем условия расширенного фильтра. Предполагается, что в данной ячейке выбирается товарная группа, и она ссылкой идет в поле расширенного фильтра, и таблица фильтруется. Но вот проблема: фильтр не срабатывает, когда выбираю ячейку и она автоматом подставляется в условие фильтра. Когда руками встаю в ячейку с условием и формулой и нажимаю Enter, то срабатывает, а когда выбираю, то не работает. Получается, что условие фильтра не реагирует на изменение состава ячейки согласно формулы?
Возможно ли что-то здесь исправить?
Спасибо за ранее.
Все сделал по вашим примерам, но фильтр не выводит наименовании на 13ти тысячной строке.
Почему?
Спасибо!