Страницы: 1
RSS
Извлечение уникальных данных и их сортировка формулами, немассивная формула для извлечения и сортировки текстовых и числовых данных в ячейках
 
Добрый день, коллеги!
Вдохновленный трудами Майкла Гирвина и его книгой "Ctrl+Shift+Enter. Освоение формул массива в Excel.", низкий поклон за перевод которой Сергею Багузину и размещение оной безвоздмездно в интернете,задался вопросом. возможно ли выполнить извлечение и сортировку уникальных данных, содержащих текст числа и пустые строки немассивной формулой? Что плохого, по моему скромному мнению, в формулах массива? То что это доставляет некоторые сложности при внесении изменений в первоначальной формуле при попытке её изменения (например при попытке добавить дополнительные критерии отбора), Excel ругается о невозможности изменить часть массива. Задачу я решил "неэлегантно", опишу в двух словах принцип действия

1. Начиная по-моему с 2010-й версии появилась мощнейшая и восхительная функция АГРЕГАТ. Она может внутри себя "игнорировать ошибки", то чего не хватало НАИМЕНЬШИЙ и проч. Стало быть стало возможным внутри неё выполнять различные операции с массивами, в том чиле делить на ноль, ведь эти данные будут проигнорированы
2. АГРЕГАТ сам по себе отлично извлекает и сортирует числовые значения. Это делается просто: двухэтажная дробь
(массив)/(ПОИСКПОЗ(массив;массив;0)={1:2:3:4:5....n})
3. Сложнее с сортировкой текста, там дроби внутри функции АГРЕГАТ трёхэтажные, где в знаменателе идет сравнение с ещё одним АГРЕГАТОМ, и естественно не обойтись без ИНДЕКСА, ведь речь о Тестовых данных
4.В чём, неэлегатность решения, на мой взгляд. Я воспользовался функцией ЕСЛИОШИБКА
в значениии "истина" стоит формула из п.2, в значении "ошибка" стоит формула из п.3 (немного модернизированная)

Прикладываю файл примера. Два вопроса, друзья
1. Есть идеи как уйти от ЕСЛИОШИБКА
2. Что делать с текстом, если какая либо машинистка ввела нечаянно перед ним пробел и он сортируется уже не по правилам

С безграничным уважением!
 
взамен вашей ф
в F3
Код
=ИНДЕКС($B$3:$B$50;АГРЕГАТ(15;6;СТРОКА($A$1:$A$49)/ЕНД(ПОИСКПОЗ($B$3:$B$50;$F$2:F2;0));1))
 
copper-top
Но Ваша формула, к сожалению, не сортирует уникальные извлеченные значения
Изменено: Akropochev - 23.08.2017 12:45:47 (Замечание модератора)
 
извиняюсь. мое решение не верное.
 
1. Уйти от ЕСЛИОШИБКА( можно так:
ЕСЛИ(СУММПРОИЗВ(--ЕЧИСЛО($B$3:$B$13))>=(СТРОКА($B3)-СТРОКА($B$3)+1);
сравнивать количество чисел в исходных данных с номером очередного элемента. Если номер превышает количество чисел, то переходить к обработке текстовых.

Вот только это усложняет формулу, а делает ли ее более корректной?

2. Можно, конечно, впихнуть СЖПРОБЕЛЫ в ряд мест, но... Кроме очередного усложнения (которого Вы, по-моему, не страшитесь), чем-то надо будет заменить СЧЁТЕСЛИ (он работает в качестве аргумента исключительно с диапазоном без каких-либо манипуляций с ним).
Возможный вариант обработать входные данные либо на месте, либо допстолбцом =СЖПРОБЕЛЫ(B3), =ПОДСТАВИТЬ(B3;"  ";" "), =СЖПРОБЕЛЫ(ПОДСТАВИТЬ(B3;"  ";" ")) и как угодно еще...

1. Хоть себе я друг, но истина дороже. Не просто числа надо считать, а уникальные числа, поэтому вместо предложенного ранее:
ЕСЛИ(СУММПРОИЗВ(--(ПОИСКПОЗ($B$3:$B$13&"";$B$3:$B$13&"";0)*ЕЧИСЛО($B$3:$B$13)=(СТРОКА($B$3:$B$13)-СТРОКА($B$3)+1)))>=(СТРОКА($B3)-СТРОКА($B$3)+1);
Изменено: PerfectVam - 24.08.2017 16:53:13
Следствие из третьего закона Чизхолма:
"Даже если ясность изложения исключает неверное толкование, все равно найдется кто-то, кто поймет Вас неправильно."
 
PerfectVam, спасибо. У меня примерно это же и заложено во второй части формулы ЕСЛИОШИБКА. Принцип в том, что после извлечения уникальных чисел, включается функция извлечения уникального текста, и для корректности она должна начинаться с единицы, поэтому у меня так:
ЧСТРОК($B$3:$B3)-СУММПРОИЗВ(--(ПОИСКПОЗ($B$3:$B$13&"";$B$3:$B$13&"";0)*ЕЧИСЛО($B$3:$B$13)=(СТРОКА($B$3:$B$13)-СТРОКА($B$3)+1)))
Страницы: 1
Наверх