Функции динамических массивов: СОРТ, ФИЛЬТР и УНИК

Эта статья является логическим продолжением предыдущего материала про новые динамические массивы (ДМ), появившиеся в Excel в Office 365. Если вы ещё с не ознакомились (кому лень читать - там есть видео), то очень советую сделать это сейчас, чтобы понимать о чём, собственно, идёт речь и как заполучить все эти радости в вашем Excel.

Обновление Office 365, которое подарило Microsoft Excel новый вычислительный движок с поддержкой динамических массивов, также добавило к нашему арсеналу 7 новых функций, заточенных специально для работы с массивами. В этой статье я хотел бы рассказать про три самых важных функции: СОРТ, ФИЛЬТР и УНИК. Остальные играют скорее вспомогательную роль - про них чуть позже.

Для простоты я буду во всех примерах я буду показывать работу этих функций на обычных таблицах, но можно иметь ввиду, что с "умными" таблицами (созданными через Главная - Форматировать как таблицу или сочетанием клавиш Ctrl+T) эти функции тоже отлично работают.

Итак, поехали...

Функция СОРТ (SORT)

Синтаксис:

=СОРТ(массив; [индекс_сортировки]; [порядок_сортировки]; [по_столбцу])

В самом простом варианте требует в качестве аргумента только массив (диапазон) и выдает его уже в отсортированном виде:

Функция СОРТ (SORT) - простой случай

По умолчанию сортировка выполняется по возрастанию. Если нужен обратный порядок, то за это отвечает третий аргумент (1 - по возрастанию, -1 - по убыванию):

Обратная сортировка

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

Сортировка по 3-му столбцу

Если хочется сортировать по нескольким столбцам сразу, то придётся задать массив номеров столбцов во втором аргументе в фигурных скобках. Одновременно аналогичным образом можно задать третьим аргументом и направление сортировки для каждого столбца.

Например, если мы хотим отсортировать наш список по городам по возрастанию и затем по суммам по убыванию, то это будет выглядеть так:

Одновременная сортировка по нескольким столбцам в разном направлении

Последний аргумент используется, если нужно сортировать не строки, а столбцы, т.е. упорядочивать данные по горизонтали, что встречается существенно реже.

Вот так - просто и изящно. Особенно, если вспомнить какую монстрообразную формулу массива требовалось ввести раньше для сортировки всего лишь одного (!) столбца:


Бррр... :(

Функция ФИЛЬТР (FILTER)

Синтаксис:

=ФИЛЬТР(массив; включить; [если_пусто])

Назначение этой функции - принять в качестве аргумента массив исходных ячеек и отфильтровать его по заданному условию(ям). Какие строки включить в результаты, а какие убрать - определяется вторым аргументом. Он должен представлять из себя массив логических значений ЛОЖЬ (FALSE) и ИСТИНА (TRUE), задающих статус для каждой строки:

Фильтрация функцией ФИЛЬТР

Логическую ИСТИНУ и ЛОЖЬ можно, для компактности, заменить на 1 (или любое другое число) и 0 (или пустую ячейку):

Фильтрация по единичкам

А самое интересное, что логические значения могут быть результатом какого-либо выражения, например:

Фильтр по условию

Если чуть подумать, то простор для фантазии тут открывается широкий. Вот вам для затравки несколько вариантов условий, с которыми замечательно будет работать эта функция:

  • =ФИЛЬТР(B2:D25; D2:D25>=10000) - отбираем все заказы, где стоимость больше или равна 10 000
  • =ФИЛЬТР(B2:D25; ЛЕВСИМВ(B2:B25) = "Б") - фильтрация всех строк, где название товара начинается с "Б" (блуза, брюки, бриджи и т.д.)
  • =ФИЛЬТР(B2:D25; (B2:B25 = "Брюки") * (C2:C25 = "Анна")) - отбор всех сделок Анны, где она продавала брюки
  • =ФИЛЬТР(B2:D25; (C2:C25 = "Анна") + (C2:C25 = "Иван")) - все сделки Анны и Ивана
  • =ФИЛЬТР(B2:D25; ЕСЛИОШИБКА(ПОИСК("Самара";A2:A25);0)) - фильтрация всех сделок, где в названии города содержится слово Самара (г. Самара, Самара г., город Самара, Самара-городок и т.д.)

Если функция ФИЛЬТР не находит ни одного значения, удовлетворяющего условию, то она выдаёт ошибку #ВЫЧИСЛ! Чтобы вывести вместо неё что-то более осмысленное, можно использовать третий аргумент:

Сообщение, если ничего не найдено

Функция УНИК (UNIQUE)

Синтаксис:

=УНИК(массив; [по_столбцам]; [один_раз])

В самом простом варианте эта функция извлекает из входного массива все имеющиеся там значения, удаляет повторы и выдаёт то, что осталось:

Извлечение уникальных функцией УНИК

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

Извлечение уникальных строк

Очень интересно работает третий аргумент - он заставляет функцию извлечь из исходного массива только те данные, которые встречаются там всего один раз, т.е. не имеют клонов:

Извлечение только уникальных элементов

Комбинирование функций

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

Разберём, для примера, классическую задачу: предположим, что нам нужно сформировать справочник по городам для выпадающего списка на основе выгрузки из какой-нибудь базы данных. В исходной выгрузке города повторяются в случайном порядке, есть пустые ячейки и дубли. А необходимый нам справочник, содержащий эталонный набор городов, должен быть:

  • без повторов
  • без пустых ячеек
  • отсортирован по возрастанию от А до Я

Делается всё вышеперечисленное одной (!) формулой:

Комбинирование функций массива

В английской версии эта функция выглядит как:

=SORT(UNIQUE(FILTER(B2:B100000;NOT(ISEMPTY(B2:B100000)))))

Здесь:

  • ФИЛЬТР - отбирает только те ячейки, где есть данные (не пусто)
  • УНИК - убирает повторы в отобранном функцией ФИЛЬТР списке
  • СОРТ - сортирует получившийся справочник по алфавиту

После этого останется только указать получившийся динамический массив как источник для выпадающего списка на вкладке Данные - Проверка данных (Data - Validation), не забыв добавить после адреса первой ячейки массива знак решётки:

Вып.список на динамическом массиве с формулами

Причем, несмотря на приличный размер исходного диапазона (100 тыс. строк!) никакого торможения при пересчёте такой формулы нет абсолютно - новый вычислительный движок Excel справляется "на ура". При этом классические формулы массива на подобных задачах начинали ощутимо подтупливать на таблицах уже с 3-5 тыс. строк, а на 100 тыс. просто загнали бы ваш Excel в кому.

Оглядываясь назад и вспоминая все свои выполненные проекты по автоматизации за последние Х лет, с грустью понимаю сколько дней и даже, наверное, недель можно было бы сэкономить, если бы динамические массивы и такие функции существовали тогда. Даааа....

Ну, лучше поздно, чем никогда, верно? По крайней мере, нашим детям точно будет проще :)

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



24.09.2019 14:57:31
Николай, спасибо за статью. Чую скоро Power Pivot целиком переплывет в Excel. ;)

А как вся эта красота работает с диапазонами из закрытых книг?
07.08.2020 18:18:36
у меня эти функции работают с закрытым источником, хотя в описании функций от MS сказано, что не поддерживается такое...странно..
03.10.2019 13:05:34
Подскажите, пожалуйста, начиная с какой версии доступны эти функции?
у меня Microsoft Office 365 ProPlus
Версия 1909 (сборка 12026.20264) Monyhly Channel
их до сих порт нет.
Если смотреть о Excel то Microsoft Excel для Office 365 MSO (16.0.12026.20100) 32-разрядная
11.10.2019 11:54:12
А можно ФИЛЬТР в ФИЛЬТР засунуть ? А то что-то не получается. То ли я не понимаю, то ли и впрям нельзя.
13.12.2019 12:27:20
нет таких функций в офисе 19
28.01.2020 10:56:30
А можно при помощи функции ФИЛЬТР вернуть не весь массив, а только отдельные его части? Скажем, у нас есть массив с данными A2:E20. А я хочу вернуть только столбцы A2:A20 и D2:D20.
Всё, что между ними - не отображать. На выходе - отфильтрованная табличка с 2-мя столбцами
28.01.2020 14:47:19
Александр, можете попробовать использовать функцию ВЫБОР для определения нужного массива, после чего будете использовать фильтрацию.
07.08.2020 15:24:12
Или с помощью функции ИНДЕКС(), указываем все строки и нужные столбцы:
ИНДЕКС(A2:D20;строка(1:20);{1;4})
26.02.2020 22:12:36
Добрый вечер, эти 3 функции не выдают результат или выдают не корректно, если результат необходимо размещать в "умной таблице". Как это можно исправить?
07.08.2020 17:01:31
А в Office 2019 не будет этого обновления, только в 2021?
22.10.2021 15:05:22
В английской версии эта функция выглядит как:

ISEMPTY нет такива виду функция в Excel !
=SORT(UNIQUE(FILTER(B2:B100000;NOT(ISNONTEXT(B2:B100000)))))
29.12.2021 16:23:38
не удаления сорри убрал ранее написанный текст
13.02.2022 21:01:06
Недавно в одном из пабликов было задание из числа получить число с уникальными цифрами, отсортированными по возрастанию. В результате решения задачи обнаружилась одно замечательное применение этих новых формул - вместе с обычными формулами они могут организовывать цикл вычислений внутри самой ячейки.
Вот само задание:
Исходное число - 25456585 Необходимо получить число - 24568
Формула будет следующей -
=ОБЪЕДИНИТЬ("";;СОРТ(УНИК(ПСТР(B2;СТРОКА(1:10);1));1;1))
 

Т.е., несмотря на то, что функции "СОРТ" и "УНИК" сами по себе выводят динамический массив на несколько ячеек, функция "ОБЪЕДИНИТЬ" схлопывает это в одну ячейку, тем самым вывод уникальных значений и их сортировка пользователю не показываются. Браво Excel!
21.03.2022 00:33:54
В инетах видел вместо НЕ(ЕПУСТО(В:В)) используют для фильтрации ДЛСТР(В:В).
Говорят, что суть та же, но выглядит короче.
23.03.2022 08:59:51
Подскажите, как решить такую же задачку без функции Фильтр. 20й офис, в функционале отсутствует фильтр.
Необходимо в одну таблицу построчно вписать данные из другой таблицы по одному признаку
23.03.2022 09:00:34
Или как можно самому написать функцию Фильтр через макрос и добавить себе в функционал?
28.03.2023 21:43:20
используя функцию фильтр для таблицы в которой 10 столбцов, необходимо получить таблицу в 5 столбцов остальные столбы не нужны, как этого добиться, функция индекс не помогла
09.02.2024 20:15:37
:) Ура! Отличная статья. СПАСИБО!
Наверх