Динамическая сортировка таблицы в EXCEL

history

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


Пусть имеется таблица, состоящая из 2-х столбцов. Один столбец – текстовый: Список фруктов ; а второй - числовой Объем Продаж (см. файл примера ).

Задача1 (Сортировка таблицы по числовому столбцу)

Необходимо отсортировать строки таблицы по содержимому числового столбца (по Объему продаж). Предполагается, что пользователь постоянно заполняет строки таблицы, поэтому необходимо написать формулы с учетом добавляемых значений.

Для наглядности величины значений в столбце Объем Продаж выделены с помощью Условного форматирования ( Главная/ Стили/ Условное форматирование/ Гистограммы ). Также желтым выделены повторяющиеся значения.

Примечание : Задача сортировки отдельного столбца (списка) решена в статьях Сортированный список (ТЕКСТовые значения) и Сортированный список (ЧИСЛОвые значения) .

Решение1



Если числовой столбец гарантировано не содержит повторяющихся значений, то задача решается легко:

  • Числовой столбец отсортировать функцией НАИБОЛЬШИЙ() (см. статью Сортированный список (ЧИСЛОвые значения) );
  • Функцией ВПР() или связкой функций ИНДЕКС()+ПОИСКПОЗ() выбрать значения из текстового столбца по соответствующему ему числовому значению.

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

Поэтому механизм сортировки придется реализовывать по другому.

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

В столбцах D и E разместим таблицу, которая будет динамически сортироваться,

В ячейке Е7 запишем зубодробительную формулу массива :

=ИНДЕКС(Продажи; ОКРУГЛ(ОСТАТ(НАИБОЛЬШИЙ( --(СЧЁТЕСЛИ(Продажи;"<"&Продажи)&","&ПОВТОР("0";3-ДЛСТР(СТРОКА(Продажи)-СТРОКА($E$6)))&СТРОКА(Продажи)-СТРОКА($E$6)); СТРОКА()-СТРОКА($E$6));1)*1000;0) )

Данная формула сортирует столбец Объем продаж (динамический диапазон Продажи ) по убыванию. Пропуски в исходной таблице не допускаются. Количество строк в исходной таблице должно быть меньше 1000.

Разберем формулу подробнее:

  • Формула СЧЁТЕСЛИ(Продажи;"<"&Продажи) возвращает массив {4:5:0:2:7:1:3:5}. Это означает, что число 64 (из ячейки B7 исходной таблицы, т.е. первое число из диапазона Продажи ) больше 4-х значений из того же диапазона; число 74 (из ячейки B8 исходной таблицы, т.е. второе число из диапазона Продажи ) больше 5-и значений из того же диапазона; следующее число 23 - самое маленькое (оно никого не больше) и т.д.
  • Теперь вышеуказанный массив целых чисел превратим в массив чисел с дробной частью, где в качестве дробной части будет содержаться номер позиции числа в массиве: {4,001:5,002:0,003:2,004:7,005:1,006:3,007:5,008}. Это реализовано выражением &","&ПОВТОР("0";3-ДЛСТР(СТРОКА(Продажи)-СТРОКА($E$6)))&СТРОКА(Продажи)-СТРОКА($E$6)) Именно в этой части формулы заложено ограничение о не более 1000 строк в исходной таблице (см. выше). При желании его можно легко изменить, но это бессмысленно (см. ниже раздел о скорости вычислений).
  • Функция НАИБОЛЬШИЙ() сортирует вышеуказанный массив.
  • Функция ОСТАТ() возвращает дробную часть числа, представляющую собой номера позиций/1000, например 0,005.
  • Функция ОКРУГЛ() , после умножения на 1000, округляет до целого и возвращает номер позиции. Теперь все номера позиций соответствуют числам столбца Объемы продаж, отсортированных по убыванию.
  • Функция ИНДЕКС() по номеру позиции возвращает соответствующее ему число.

Аналогичную формулу можно написать для вывода значений в столбец Фрукты =ИНДЕКС(Фрукты;ОКРУГЛ(...))

В файле примера , из-за соображений скорости вычислений (см. ниже), однотипная часть формулы, т.е. все, что внутри функции ОКРУГЛ() , вынесена в отдельный столбец J . Поэтому итоговые формулы в сортированной таблице выглядят так: =ИНДЕКС(Фрукты;J7) и =ИНДЕКС(Продажи;J7)

Также, изменив в формуле массива функцию НАИБОЛЬШИЙ() на НАИМЕНЬШИЙ() получим сортировку по возрастанию.

Для наглядности, величины значений в столбце Объем Продаж выделены с помощью Условного форматирования ( Главная/ Стили/ Условное форматирование/ Гистограммы ). Как видно, сортировка работает.

Тестируем

Теперь добавим новую строку в исходную таблицу. В динамически сортируемых таблицах мы должны получить соответствующую сортировку.

1. В ячейку А15 исходной таблицы введите слово Морковь ; 2. В ячейку В15 введите Объем продаж Моркови = 25; 3. После ввода значений, в столбцах D и Е автоматически будет отображена отсортированная по убыванию таблица; 4. В сортированной таблице новая строка будет отображена предпоследней.

Скорость вычислений формул

На "среднем" по производительности компьютере пересчет пары таких формул массива, расположенных в 100 строках, практически не заметен. Для таблиц с 300 строками время пересчета занимает 2-3 секунды, что вызывает неудобства. Либо необходимо отключить автоматический пересчет листа ( Формулы/ Вычисления/ Параметры вычисления ) и периодически нажимать клавишу F9 , либо отказаться от использования формул массива, заменив их столбцами с соответствующими формулами, либо вообще отказаться от динамической сортировки в пользу использования стандартных подходов (см. следующий раздел).

Альтернативные подходы к сортировке таблиц

Отсортируем строки исходной таблицы с помощью стандартного фильтра (выделите заголовки исходной таблицы и нажмите CTRL+SHIFT+L ). В выпадающем списке выберите требуемую сортировку.

Получим идентичный нашему вариант таблицы, но при добавлении в таблицу новых значений придется применять фильтр заново.

Также можно воспользоваться инструментом Сортировка ( Данные/ Сортировка и Фильтр/ Сортировка ). Для этого нужно выделить все значения исходной таблицы не включая заголовок, вызвать инструмент Сортировка, выбрать столбец, по которому требуется сортировать и вариант сортировки.

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

При использовании Таблиц в формате EXCEL2007 мы также не получим динамической сортировки. Новое значение (Картофель) останется последним в исходной таблице (до принудительной сортировки таблицы через фильтр), не смотря на его значение продаж (200).

Какой вариант предпочтительней - как всегда - выбирать разработчику.

Еще одна формула массива (+дополнительный столбец). Задача1.1

Сортировку таблицы можно сделать с помощью другой, более простой формулы массива , но нам понадобится дополнительный (служебный) столбец D (см. файл примера лист Пример2 ):

= НАИБОЛЬШИЙ(ЕСЛИ(F7=$B$7:$B$14;СТРОКА($B$7:$B$14)-СТРОКА($B$6);0);СЧЁТЕСЛИ($F$7:$F$14;F7)-СЧЁТЕСЛИ($F$6:F6;F7))

В столбце F содержится отсортированный столбец В (объем продаж). Формула возвращает позицию значения объема продаж. Например, число 86 находится в 5-й строке таблицы.

Для повторов выражение ЕСЛИ(F8=$B$7:$B$14;СТРОКА($B$7:$B$14)-СТРОКА($B$6);0) будет возвращать несколько значений: {0:2:0:0:0:0:0:8}, т.е. число 74 находится в строках 2 и 8.

С помощью функции НАИБОЛЬШИЙ() сначала выводится 2, затем 8 (в разных строках).

Эта формула более наглядна, чем рассмотренная выше в начале статьи, но требует наличия дополнительного столбца.

Задача2 (Сортировка таблицы по текстовому столбцу)

Отсортируем строки таблицы по содержимому Текстового столбца (по Фруктам).

Примечание : Про сортировку списка текстовых значений можно прочитать в статье Сортированный список в MS EXCEL (ТЕКСТовые значения)

Как и в предыдущей задаче предположим, что в столбце, по которому ведется сортировка имеются повторы (названия Фруктов повторяются).

Для сортировки таблицы придется создать 2 служебных столбца (D и E).

В столбце D введем формулу массива, возвращающую несколько значений

= СЧЁТЕСЛИ($B$7:$B$14;"<"&$B$7:$B$14)+1

Эта формула является аналогом ранга для текстовых значений (позиция значения относительно других значений списка). Текстовому значению, расположенному ниже по алфавиту, соответствует больший "ранг". Например, значению Яблоки соответствует максимальный "ранг" 7 (с учетом повторов).

В столбце E введем обычную формулу:

= СЧЁТЕСЛИ($D$6:D6;D7)+D7

Эта формула учитывает повторы текстовых значений и корректирует "ранг". Теперь разным значениям Яблоки соответствуют разные "ранги" - 7 и 8. Это позволяет вывести список сортированных значений. Для этого используйте формулу (столбец G):

= ИНДЕКС($B$7:$B$14;ПОИСКПОЗ(СТРОКА()-СТРОКА($G$6);$E$7:$E$14;0))

Аналогичная формула выведет соответствующий объем продаж (столбец Н).

Задача 2.1 (Двухуровневая сортировка)

Теперь снова отсортируем исходную таблицу по Объему продаж. Но теперь для повторяющихся значений (в столбце А три значения 74), соответствующие значения выведем в алфавитном порядке.

Для этого воспользуемся результатами Задачи 1.1 и Задачи 2.

Подробности в файле примера на листе Задача2.


Комментарии

Только для авторизованных пользователей

Аноним, 2 августа 2016 г.
А возможно реализовать подобную сортировку, но по нескольким критериям. К прммеру, по объему продаж, а если объем одинаковый (груши, апельсины),то алфавиту по фруктам?
Михаил, 4 августа 2016 г.
Хороший вопрос. Я добавил в статью Задачу 2 и 2.1. Решение Вашей задачи получилось громоздко и с дополнительными столбцами (задача 2.1). Наверное, придется использовать стандартное средство сортировки (Вкладка Данные, группа Сортировка и фильтр, Сортировка).
Аноним, 4 ноября 2016 г.
Как воспользоваться файлом примера?
Михаил, 6 ноября 2016 г.
Он в конце статьи, такая синяя кнопочка "Скачать файл примера".
Аноним, 20 ноября 2016 г.
спасибо, большое! была задача сравнить ячейки в столбце и в соседнюю ячейку записать их значения с "рейтингом", т.е. в скобках записать "1" у меньшего, 2 - у следующего и т.д. =СЦЕПИТЬ(P3;" (";(СЧЁТЕСЛИ($P$3:$P$100;"<"&$P$3:$P$100)+1);")") как-то так. очень уменьшило это мне работы.
Аноним, 31 июля 2017 г.
В задаче 1.1 для заполнения диапазона "Позиция числа в списке" использован массив с переменной ссылкой на от F7 до F14. Подскажите, где можно прочитать как это делается. Известное сочетание клавиш Ctr+Sft+Ent позволяет вводить только одинаковую формулу для всего диапазона.
Аноним, 31 июля 2017 г.
Подскажите как решить задачу 1.1 для сортировки от меньшего к большему.
Аноним, 31 июля 2017 г.
Вопрос снят. В каждой ячейке размещен отдельный массив :)
Аноним, 31 июля 2017 г.
Вопрос снят.
Аноним, 31 июля 2017 г.
Поменял в формуле объема продаж "Наибольший" на "Наименьший"
Михаил, 31 июля 2017 г.
Хороший вопрос, добавил таблицу в файл примера на лист Задача1.1. с недостающей сортировкой
Аноним, 6 января 2018 г.
у меня в файле примера на первом листе "Задача1" ничего не отсортировано по умолчанию и в моих файлах не работает данная формула. Офис 2010
Михаил, 8 января 2018 г.
пример сделан в офисе 2010. Если есть проблемы присылайте файл в нашу группу https://vk.com/excel2ru раньше проблем не возникало. используйте решение задачи 1.1, она попроще
Аноним, 23 сентября 2018 г.
а если мне текст надо по алфавиту выставить
Михаил, 24 сентября 2018 г.
Аноним, 18 февраля 2019 г.
никак не могу найти, подскажите пожалуйста! Как сделать, что бы строка, при заполнение ячейки условной содержимым "Выполнено" перемещалась вниз таблицы?? И при этом все форматирование оставалось выстроено по датам по другому столбцу?
Михаил, 21 февраля 2019 г.
У Вас должно быть 2 таблицы: таблица с исходными данными, куда вы вводите значения и таблица-отчет, которая формируется в зависимости от данных. Тогда все "переместится"
Аноним, 24 января 2020 г.
Здравствуйте! Сортировку сделали, все получилось отлично, но есть еще пара столбцов, в которых стоит общая сумма например груши и яблоки. функция =ячейка+ячейка. сортировка прошла, а значения другие. как привязать такое?
Михаил, 25 января 2020 г.
Здравствуйте, я, полагаю речь идет о сортировке по числовому столбцу. В задаче 1.1. задача решена с помощью доп. столбца. В этом "служебном" столбце (пусть D) указывается порядок вывода номеров строк. Далее, для любого столбца (пусть будет А) достаточно написать формулу =ИНДЕКС($A$7:$A$14;D7). Т.е. все остальные столбцы исходной таблицы (В, С, F, G и т.д.) выводите соответствующими формулами на основе функции ИНДЕКС
Аноним, 9 апреля 2020 г.
Добрый день! Подскажите, как динамически сортировать по датам (от старой к новой)? Мне нужно, чтобы при внесении в таблицу новой даты она сразу же вставала в нужном порядке относительно других.
Михаил, 9 апреля 2020 г.
К сожалению это сделать в EXCEL невозможно (( Вот какой есть принцип построения таблиц в EXCEL: -в одну таблицу вы вводите данные (т.е. создаете удобную таблицу для ввода данных); -в другой таблице (можно на другом листе) данные отображаются как вам нужно (это таблица-отчет, в которой вы можете настроить сортировку, форматирование и пр.). Если нарушаете этот принцип, то получаете сложности: необходимо использовать макросы, сложные формулы и пр. Для динамической сортировки (уже введенных данных) используйте пример из этой статьи. EXCEL обрабатывает даты также как числа.
Вадим, 10 января 2021 г.
здравствуйте, а можно ли накатить числовой фильтр на динамическую сортировку?К примеру что б в отсортированном столбце объем продаж показывались объемы больше или равно 50, к примеру?
Михаил, 12 января 2021 г.
Добрый день, Числовой фильтр недоступен, потому что в столбце есть значения "", это те , что пустые. 1.Можно убрать эти значения и числовой фильтр станет доступным, но тогда сортировка перестанет быть динамической (при добавлении нового значения в исх. таблицу придется протягивать формулу. 2.Можно заменить "" на число, которое заведомо не встретится, например, -99999999999 (для сортировки по убыванию). См. задача1, кусок формулы ...СТРОКА($D$6));1)*1000;0));"") замените на СТРОКА($D$6));1)*1000;0));-9999999). Эти -99999 можно скрыть условным форматированием также как были скрыты ошибки #ЧИСЛО! 3. Можно удалить лишние значения из исходного списка или сделать промежуточную таблицу с фильтром см. статью https://excel2.ru/articles/zapros-na-vyborku-dannyh-formuly-v-ms-excel
Вадим, 12 января 2021 г.
Спасибо попробую, так же подскажите, я воспользовался вашими формулами точ в точь, но таблица исходная у меня из 250 строк, выводится по ddE(данные обновляются 1-3сек).При автоматическом пересчете формул загрузка цп 94%!(цп 6 ядер,многоядерность в найстройках эксель включена)Можно ли как то снизить нагрузку, другие программы сильно тормозят??Можно ли как както что бы формулы пересчитывались раз в секунду или более?Снизу окна вижу что эксель не прекращаясь вычисляет...
Михаил, 13 января 2021 г.
Это формулы массива, они жутко тормозят. Лучше сортировать вручную с помощью Автофильтра. Всего 2 нажатия мышкой!
Вадим, 13 января 2021 г.
Фильтр сделать получилось по 2 методу,но теперь при выводе по dde эксель выводит ошибку конфликт имен,может ли это быть из за того что я не скрыл эти -999999?Честно говогоря не понял(не увидел в статье) как применить условное форматирование.Второй метод сортировки самый подходящий для меня((
Вадим, 13 января 2021 г.
вернее эксель пишет имя не может совпадать со встроенным именем
(только для авторизованных пользователей)

© Copyright 2013 - 2024 Excel2.ru. All Rights Reserved