← Все курсы · Курс Excel · Все руководства

Динамические массивы Excel: ФИЛЬТР, УНИКАЛЬНОСТЬ и СОРТИРОВКА в одной формуле

Одна формула, столько ячеек, сколько необходимо для ответа · Часть Analyst Prep Kit

К , аналитик данных · Опубликовано

К концу этой страницы вы можете извлечь отдельный список из столбца, извлечь каждую строку, соответствующую условию, отсортировать результат, не трогая источник, объединить все три в одну строку и прочитать два сообщения об ошибках, которые существуют только в этой части Эксель. Это около двадцати пяти минут, и все приведенные ниже выходные данные были получены путем применения формулы в Excel к таблице из шестнадцати строк.

Вот что нужно сделать прямо сейчас со столбцом, который вы продолжаете удалять дубликаты вручную. Щелкните пустую ячейку справа от ваших данных и введите =SORT(UNIQUE(A2:A500)). Нажмите Входить один раз. Под ячейкой отображается отсортированный список каждого отдельного значения, он обновляется при изменении данных, и вы больше никогда к нему не прикасаетесь.

Краткая версия: формула может возвращать более одного значения, а Excel помещает дополнительные значения в ячейки ниже. Это называется разливом, и в этом вся особенность.

Одна формула, заполняющая множество ячеек, — это идея, поэтому она дает представление о картине.

Five formulas, or one Two columns of five stacked cells stand side by side, each column headed by a short label. The left column is headed five formulas, and every one of its five cells carries a small dark marker in its top-left corner, meaning each cell holds its own formula; the five cells are separate, each with its own light border. The right column is headed one formula. Only its top cell carries the marker, and the four cells beneath it are unmarked. A single heavy border is drawn around the whole right-hand column, enclosing all five cells as one object rather than five. The two columns contain the same values in the same order, so nothing about the result differs; what differs is how many places the logic lives. five formulas EastNorth SouthWest Central one formula EastNorth SouthWest Central
Те же пять ответов. Слева логика живет в пяти местах и ​​должна поддерживаться в пяти местах. Справа он находится в одной ячейке, а блок под ним — это результат этой ячейки, а не еще четыре формулы.
Что вы узнаете
  1. Что такое разлив
  2. УНИКАЛЬНОСТЬ, СОРТИРОВКА и ФИЛЬТРАЦИЯ
  3. Два или более условий в ФИЛЬТРЕ
  4. Когда ничего не совпадает
  5. Номер разлива, A1#.
  6. #РАСЛИ! и что вызывает это
  7. Сковывая их и остальных членов семьи
  8. Единственное место, куда не пойдет разлив
  9. Полное до и после
  10. Крайние случаи, которые ловят людей
  11. Почему это работает
  12. Использование этого в вашем собственном проекте
  13. Все на одном экране
Каждый результат на этой странице реален. Таблица заказов из шестнадцати строк, используемая в этом наборе руководств, где каждая формула, выполняемая в Excel, и ее выходные данные копируются обратно. Для этих функций требуется текущая версия Excel; если твой откажется от них с #NAME?, остальная часть этого набора руководств по-прежнему применима к вам, а эта страница еще не применима.

1. Что такое разлив

Перед пояснением: вводите одну формулу в одну ячейку и нажимаете Входить. Скажите, сколько клеток вы ожидаете изменить.

Столько, сколько необходимо для ответа. Запросите отдельные регионы, и Excel вернет четыре значения, поэтому он заполнит четыре ячейки:

=UNIQUE(Orders[Region])

North
South
East
West

Только верхняя ячейка содержит формулу. Три под ним содержат переполнение, и сами по себе их нельзя редактировать; щелкните один, и в строке формул формула будет выделена серым цветом, поскольку она принадлежит ячейке выше. Excel рисует тонкую синюю рамку вокруг всего блока, чтобы показать, что это одно.

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

Обратите внимание на порядок, в котором он вернулся: Север, Юг, Восток, Запад. Это порядок, в котором значения сначала появляются в данных, а не в алфавитном порядке. UNIQUE не сортирует, поэтому существует следующая функция.

2. УНИКАЛЬНОСТЬ, СОРТИРОВКА И ФИЛЬТРАЦИЯ

Три функции охватывают большую часть того, что нужно каждому.

UNIQUE возвращает различные значения.

=SORT(UNIQUE(Orders[Region]))       East, North, South, West
=SORT(UNIQUE(Orders[Product]))      Chair, Desk, Lamp
=COUNTA(UNIQUE(Orders[Region]))     4

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

SORT заказывает диапазон, не касаясь его. SORT(array, column, order), где порядок равен 1 для возрастания и −1 для убывания.

=SORT(Orders[Revenue], 1, -1)
1100, 880, 880, 850, 765, 680, 660, 660, 600, 510, 480, 440, 440, 425, 280, 240

=TAKE(SORT(Orders[Revenue], 1, -1), 3)
1100, 880, 880

Сортировка по формуле, а не с помощью кнопки «Сортировка» имеет большее значение, чем кажется. Кнопка постоянно меняет порядок ваших данных и берет с собой любую формулу, которая ссылается на номер строки. Формула СОРТИРОВКИ создает отсортированную копию, оставляет источник в покое и повторно сортирует себя при изменении чисел.

FILTER возвращает строки, соответствующие условию.

=FILTER(Orders[OrderID], Orders[Region]="North")
1001, 1004, 1007, 1011, 1014

=ROWS(FILTER(Orders[OrderID], Orders[Region]="North"))       5
=SUM(FILTER(Orders[Revenue], Orders[Region]="North"))     2495

Прочтите аргументы как предложение: дайте мне этот, где что это правда. Первый аргумент — это то, что вы хотите вернуть, а второй — проверка, и это могут быть разные столбцы, что отличает ФИЛЬТР от кнопки фильтра.

Обратите внимание, что ФИЛЬТР можно обернуть чем угодно. SUM фильтруемого столбца — условный итог, ответ тот же SUMIFS дает, а 2495 — это доход Норта в любом случае. Разница в том, что версия FILTER может возвращать сами строки, когда вы хотите их просмотреть.

3. Два или более условий в ФИЛЬТРЕ.

Перед пояснением: В FILTER некуда ставить AND или OR. Скажите, как бы вы запросили заказы с Востока на сумму более 600 штук.

С арифметикой. Умножьте условия для И, добавьте их для ИЛИ и заключите каждое из них в скобки.

=FILTER(Orders[OrderID], (Orders[Region]="East") * (Orders[Revenue]>600))
1003, 1006, 1010                                          3 rows

=ROWS(FILTER(Orders[OrderID], (Orders[Region]="East") + (Orders[Region]="West")))
7 rows

Причина в том, что условие выдает ИСТИНА и ЛОЖЬ, которые в арифметике ведут себя как 1 и 0. Умножение дает 1 только тогда, когда оба числа равны 1, то есть И. Сложение дает как минимум 1, если любой из них равен 1, то есть ИЛИ. Как только вы это увидите, синтаксис перестанет выглядеть произвольным.

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

4. Когда ничего не совпадает

Перед пояснением: вы фильтруете регион, которого нет в данных. Предскажите, что появится в ячейке.

=FILTER(Orders[OrderID], Orders[Region]="Central")

#CALC!

#CALC! это более новая ошибка, означающая, что формула создала пустой массив, который ячейка не может отобразить. В вашей формуле нет ошибки; Excel говорит вам, что ответ — ничего.

У FILTER есть третий аргумент именно для этого, и использовать его лучше, чем заключать все это в обработчик ошибок:

=FILTER(Orders[OrderID], Orders[Region]="Central", "no orders")

no orders

Третий аргумент срабатывает только в пустом случае, поэтому реальная проблема в формуле по-прежнему проявляется как собственная ошибка. Заворачивание в IFERROR вместо этого скрыл бы оба, что является одной и той же сделкой ЕСЛИОШИБКА всегда просит вас сделать, и здесь нет никаких оснований принимать это, поскольку существует целенаправленный аргумент.

5. Номер разлива, A1#.

Разлитый блок меняет размер, поэтому обратиться к нему по адресу — проблема, ожидающая следующего месяца. Хэш-суффикс решает эту проблему: C1# означает «во что бы ни пролилось C1, каким бы большим оно ни было сейчас».

C1:  =UNIQUE(Orders[Region])        spills into C1:C4

=COUNTA(C1#)                        4
=TEXTJOIN("/", TRUE, C1#)           North/South/East/West

Именно это заставляет динамические массивы объединяться в небольшую систему, а не оставаться одной умной формулой. Создайте отдельный список регионов, затем наведите на него диаграмму, раскрывающийся список или столбец SUMIFS. C1#, и все они растут при добавлении региона. Ссылка на ячейку, например C1:C4 не стал бы.

Это также дает вам гораздо лучший список проверки данных, чем фиксированный диапазон: =$C$1# в поле «Источник» раскрывающегося списка, а параметры поддерживаются на основе данных, которые напрямую связаны с раскрывающееся руководство аргумент в пользу того, что список должен находиться там, где он может расти.

6. #РАЗЛИВ! и что вызывает это

До пояснений: ваша УНИКАЛЬНАЯ формула работала вчера и сегодня показывает #SPILL!. Скажите, что изменилось.

Что-то мешает. Для сброса необходимо, чтобы каждая ячейка, которую он хочет занять, была пустой, а если хотя бы одна из них не пуста, вся формула отказывается, а не перезаписывает что-либо. Вот прогон: формула правильно разлилась в C1:C4, затем в C3 было набрано значение.

before               North, South, East, West     COUNTA(C1#) = 4
after typing in C3   #SPILL!                      COUNTA(C1#) = 1

Обратите внимание на второй эффект. Все, что ссылается на ссылку на разлив, теперь видит одну ячейку вместо четырех, поэтому на основе нее строится диаграмма, раскрывающийся список или итоговое значение. C1# незаметно сжимается до ячейки ошибки. Ошибка громкая; удара нет.

Excel помогает найти блокировку: щелкните предупреждающий треугольник на ячейке с ошибкой и выберите «Выбрать мешающие ячейки». Четыре причины охватывают почти все.

Что-то находится в диапазоне, включая случайное пространство, введенное много лет назад. Это случай выше.

Пролитая жидкость стекала с простыни. Формуле в строке 1048000 некуда поставить двадцать строк.

Зона разлива находится внутри объединенной ячейки. Объединенные ячейки не могут получить сброс.

Формула находится внутри таблицы. У которого есть отдельный раздел, потому что люди встречаются с ним случайно.

7. Сковывание их и остальных членов семьи.

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

=SORT(UNIQUE(FILTER(Orders[Rep], Orders[Revenue]>600)))

UNIQUE также может работать с несколькими столбцами, поэтому вы получаете каждую комбинацию, которая действительно встречается, а не каждую комбинацию, которая могла бы:

=ROWS(UNIQUE(CHOOSE({1,2}, Orders[Region], Orders[Product])))     12

Двенадцать пар «регион-продукт» из шестнадцати заказов, то есть все четыре региона умножаются на все три продукта, то есть каждый регион продает каждый продукт. Сводная таблица покажет вам то же самое, что и сетка; это дает вам список, который может использовать формула.

Еще четверо, которые стоит знать поименно.

=SORTBY(Orders[OrderID], Orders[Region], 1, Orders[Revenue], -1)
sorts by one column and returns another; here, by region then by revenue descending,
so the first order out is 1010

=SEQUENCE(3)         1, 2, 3            a column of numbers
=SEQUENCE(1,4)       1, 2, 3, 4         a row of numbers
=TAKE(array, 3)                          the first three rows
=TEXTJOIN(", ", TRUE, SORT(UNIQUE(Orders[Region])))
East, North, South, West                 a spill flattened into one cell

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

Представьте на мгновение свою самую повторяющуюся задачу на листе: вкладку, на которой вы копируете столбец, удаляете дубликаты, сортируете его и вставляете куда-нибудь. Какая строка выше заменяет все это?

8. Единственное место, куда не пойдет разлив

Перед объяснением: столы являются подходящим домом для данных, а динамические массивы — это современный способ написания формул. Скажите, что происходит, когда вы помещаете одно в другое.

a cell inside a table:  =UNIQUE(Orders[Region])

#SPILL!

Таблица не может содержать развернутый результат. Причина скорее структурная, чем произвольная: задача таблицы — одна строка на запись, причем каждый столбец имеет одинаковую длину, а формула, которая сама решает, сколько строк ей нужно, нарушит это обещание. Таким образом, две функции, которые по отдельности являются лучшими практиками в Excel, не объединяются, и обходной путь состоит в том, чтобы просто разместить формулы на листе за пределами любой таблицы.

Это не то же самое, что сказать, что они не умеют читать таблицу. Каждая формула на этой странице читается Orders[Region], столбец таблицы, и выводит ответ на лист рядом с ним. Таблицы на входе, массивы на выходе.

Полное до и после

Та же работа: живой список регионов и крупные заказы в этом месяце.

До

Copy column D to a spare sheet.
Data, Remove Duplicates.
Sort A to Z.
Filter the main table to Revenue > 600, copy the visible rows, paste them somewhere.
Next month, do all of it again, and remember the pasted list is now out of date.

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

после

=SORT(UNIQUE(Orders[Region]))                     East, North, South, West
=COUNTA(UNIQUE(Orders[Region]))                   4
=FILTER(Orders[OrderID], Orders[Revenue]>600, "none")
=SUM(FILTER(Orders[Revenue], Orders[Region]="North"))    2495

Четыре формулы, никаких копий, и каждая из них обновляется при добавлении строки. Отдельный счетчик, расположенный рядом со списком, — это та часть, которую стоит хранить дольше всего: это сигнал тревоги в одну ячейку о проблемах с данными, которые в противном случае были бы обнаружены несколько недель спустя.

Утверждение, и это повод выучить три названия функций: копирование, устранение дубликатов, сортировка, вставка — это четыре ручных действия, создающих снимок, и =SORT(UNIQUE(...)) — это одна формула, производящая что-то, что будет верным в следующем месяце.

Крайние случаи, которые ловят людей

Шесть, о которых стоит знать, прежде чем они произойдут.

Удаление верхней ячейки удаляет весь блок. В ячейках ниже нет формулы, поэтому они исчезают вместе с ней. Все, что относится к блоку # идет с ними.

Вставка строки через область разлива. Блок представляет собой один объект и не принимает строку через середину, поэтому вставка либо перемещает весь блок, либо запускает триггер. #SPILL!. Оставьте свободную колонку для разливов, а не размещайте их среди другого контента.

Пустая ячейка в исходном столбце. UNIQUE рассматривает пробел как значение и возвращает для него ноль, поэтому отдельный список может вернуться на единицу длиннее, чем ожидалось, с случайным 0 в конце. Отфильтруйте это: =SORT(UNIQUE(FILTER(range, range<>""))).

Отправка файла в более старую версию Эксель. Этих функций там не существует, и формулы приходят в виде _xlfn.UNIQUE и покажи #NAME?. Если книгу нужно переместить, проверьте версию получателя, прежде чем восстанавливать ее с учетом потерь.

Ссылки на весь столбец. =UNIQUE(A:A) просит Excel рассмотреть миллион строк и обычно возвращает миллион строк, большая часть которых пуста. Вместо этого укажите на столбец таблицы.

Объем. Разлив десятков тысяч строк — это одна формула и множество ячеек, а несколько таких на одном листе заметно замедлят работу книги. Подведите итоги, используя сводку, если ответом является краткое изложение; пролить, когда ответом является список.

Почему это работает

Изменение здесь не в том, что Excel получил три функции. Дело в том, что формуле теперь разрешено возвращать целый массив, а не одно значение, и это различие восходит к некоторым из самых старых представлений о вычислениях в области обозначений. Аргумент Айверсона, выдвинутый им, когда он получил премию Тьюринга, заключался в том, что нотация, которая позволяет вам работать с целыми коллекциями одновременно, делает больше, чем просто экономит нажатия клавиш: она меняет мысли, которые легко иметь в виду, потому что операции, которые в противном случае потребовали бы явного цикла, становятся одним выражением, которое вы можете читать и манипулировать (Айверсон, 1980, Коммуникации ACM, 23(8), 444–465). SORT(UNIQUE(FILTER(...))) именно это. В старых обозначениях для каждой из этих трех идей требовался отдельный столбец скопированных формул, а форма ответа должна была определяться заранее в зависимости от того, насколько далеко вы затащили.

Практическая выгода — меньше мест, где может жить ошибка. Аудит электронных таблиц постоянно выявляет ошибки в подавляющем большинстве проверенных рабочих книг, и скопированные формулы вносят известный вклад: одна неверная копия из четырехсот выглядит точно так же, как остальные триста девяносто девять (Панко, 1998, Журнал вычислений для конечных пользователей, 10(2), 15–21). Разлитый результат не может иметь противоречивую строку, поскольку формула только одна. Это свойство стоит больше, чем краткость.

Одно замечание в шпаргалке ниже. Он создан для того, чтобы его просматривали и вспоминали, а не перечитывали, потому что практика извлечения информации обеспечивает длительное удержание, а перечитывание приводит к знакомству, и во время их выполнения вы чувствуете себя одинаково (Краснее & Батлер, 2011, Тенденции в когнитивных науках, 15(1), 20–27).

Использование этого в вашем собственном проекте

Переписывать всю книгу в динамических массивах — это утомительно и ненужно. Вместо этого сделайте это по порядку.

  1. Найдите руководство по удалению дубликатов. В каждой книге есть один столбец, который кто-то копирует, дедуплицирует и сортирует. Замените его на =SORT(UNIQUE(...)) и удалите устаревшую копию.
  2. Поставьте рядом с ним отдельный счетчик, =COUNTA(UNIQUE(...))и воспринимайте любое изменение этого числа как новость.
  3. Замените вставленные отфильтрованные экстракты на ФИЛЬТР.и дайте каждому FILTER свой третий аргумент, чтобы пустой результат говорил об этом словами.
  4. Раскрывающиеся списки и диаграммы точек на месте разлива, =$C$1#, поэтому они растут вместе со списком.
  5. Держите разливы за пределами столов, в отдельной колонке, с свободным пространством под ними.
  6. Проверьте версию любого, кому будет передан файл, прежде чем вы построите на его основе целую книгу.

Если у вас под рукой есть бумага, один дополнительный эскиз стоит пяти минут. Нарисуйте ручную процедуру, которую вы заменяете, в виде цепочки блоков: скопируйте, вставьте, удалите дубликаты, отсортируйте, вставьте снова. Затем напишите одно имя функции над каждым полем. Большинство людей обнаруживают, что три из пяти ячеек сводятся к одной формуле, а о двух, которые этого не делают, стоит задуматься.

Подробнее об этом и еще что-нибудь подобное. Все инструкции находятся в одном месте на индекс направляющих: Excel, SQL, Python и связанные с ними методы работы.

Все на одном экране

Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.

вещьЧто он делает
РазливОдна формула возвращает множество значений и заполняет ячейки ниже.
Где живет формулаТолько верхняя ячейка. Остальное — выход.
UNIQUE(range)Различные значения в том порядке, в котором они появляются в первый раз. Не сортирует.
SORT(array, col, order)Отсортированная копия. −1 для спуска. Источник нетронутый.
SORTBYОтсортируйте что-то по столбцам, которых нет в результате.
FILTER(what, test, if_empty)Строки, в которых тест верен.
И в ФИЛЬТРЕУмножьте условия: (a)*(b).
ИЛИ в ФИЛЬТРЕДобавьте их: (a)+(b).
Не используйтеФункции И и ИЛИ. Они сжимают массив до одного значения.
#CALC!Ответ — пустой массив. Используйте третий аргумент FILTER.
#SPILL!Что-то мешает. Выберите Препятствующие ячейки, чтобы найти его.
Ссылка на разливC1# означает весь блок, какого бы размера он ни был сейчас.
Заблокированный разливCOUNTA(C1#) падает до 1. Диаграммы и списки бесшумно сжимаются.
Внутри стола#SPILL!. Таблицы на входе, массивы на выходе.
Разное количество=COUNTA(UNIQUE(range)). Самая дешевая сигнализация данных.
Свести в одну ячейку=TEXTJOIN(", ", TRUE, spill).
Старая версия ExcelПрибывает как #NAME?. Проверьте версию получателя.
Единственная привычка, которую следует сохранить. Помещать =COUNTA(UNIQUE(column)) рядом с каждым текстовым столбцом, по которому вы группируете или фильтруете. Это одна ячейка, она ничего не стоит и превращает самую распространенную проблему с данными в любой книге, категорию, которая незаметно разделилась на две, в число, которое заметно изменилось. Если разлив ведет себя не так, как описано на этой странице, существует общая шлейф диагностики на предмет застревания.

Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Первое, что я заменил на разлив, была вкладка «списки литературы», из которой читались еще четыре листа, которая в последний раз обновлялась вручную восемь месяцев назад и в ней отсутствовали целых две категории. Что это за устаревший список, который все еще находится в вашей собственности?

Ссылки

Формула разливается, а затем прерывается с помощью #SPILL!, а причина находится где-то за кадром.

Excel для аналитиков составляет 378 страниц, ФИЛЬТР, УНИКАЛЬНЫЙ и СОРТИРОВКА читаются аргумент за аргументом, включая то, что блокирует диапазон разлива, с практическими вопросами, которые печатают ответ и причину, по которой он правильный.

Excel для аналитиков, 19 долларов США →
Практикуйте разливы на столе, который меняется под вас.

тот Курс Excel дает вам повторения: условия ФИЛЬТРАЦИИ, построенные на основе арифметических операций, объединенные СОРТИРОВКА и УНИКАЛЬНЫЕ, намеренно блокированные утечки для диагностики и карточки с информацией о том, что #CALC! и #SPILL! каждое означает. Теперь вы владеете методом; комплект - это практика. Ничего устанавливать, учетная запись не требуется.

Откройте набор Excel →