Извлечение уникальных элементов из диапазона
Способ 1. Штатная функция в Excel 2007
Начиная с 2007-й версии функция удаления дубликатов является стандартной - найти ее можно на вкладке Данные - Удаление дубликатов (Data - Remove Duplicates):
В открывшемся окне нужно с помощью флажков задать те столбцы, по которым необходимо обеспечивать уникальность. Т.е. если включить все флажки, то будут удалены только полностью совпадающие строки. Если включить только флажок заказчик, то останется только по одной строке для каждого заказчика и т.д.
Способ 2. Расширенный фильтр
Если у вас Excel 2003 или старше, то для удаления дубликатов и вытаскивания из списка уникальных (неповторяющихся) элементов можно использовать Расширенный фильтр (Advanced Filter) из меню (вкладки) Данные (Data).
Предположим, что у нас имеется вот такой список беспорядочно повторяющихся названий компаний:
Выбираем в меню Данные - Фильтр - Расширенный фильтр (Data - Filter - Advanced Filter). Получаем окно:
В нем:
- Выделяем наш список компаний в Исходный диапазон (List Range).
- Ставим переключатель в положение Скопировать результат в другое место (Copy to another location) и указываем пустую ячейку.
- Включаем (самое главное!) флажок Только уникальные записи(Uniqe records only) и жмем ОК.
Получите список без дубликатов:
Если требуется искать дубликаты не по одному, а по нескольким столбцам, то можно предварительно склеить их в один, сделав, своего рода, составной ключ с помощью функции СЦЕПИТЬ (CONCATENATE):
Тогда дальнейшая задача будет сводиться к поиску дубликатов уже в одном столбце.
Способ 3. Выборка уникальных записей формулой
Чуть более сложный способ, чем первые два, но зато - динамический, т.е. с автоматическим пересчетом, т.е. если список редактируется или в него дописываются еще элементы, то они автоматически проверяются на уникальность и отбираются. В предыдущих способах при изменении исходного списка нужно будет заново запускать Расширенный фильтр или жать на кнопку Удаление дубликатов.
Итак, снова имеем список беспорядочно повторяющихся элементов. Например, такой:
Первая задача - пронумеровать всех уникальных представителей списка, дав каждому свой номер (столбец А на рисунке). Для этого вставляем в ячейку А2 и копируем затем вниз до упора следующую формулу:
=ЕСЛИ(СЧЁТЕСЛИ(B$1:B2;B2)=1;МАКС(A$1:A1)+1;"")
В английской версии это будет:
=IF(COUNTIF(B$1:B2;B2)=1;MAX(A$1:A1)+1;"")
Эта формула проверяет сколько раз текущее наименование уже встречалось в списке (считая с начала), и если это количество =1, т.е. элемент встретился первый раз - дает ему последовательно возрастающий номер.
Для упрощения адресации дадим нашим диапазонам (например, исходя из того, что в списке может быть до 100 элементов) имена. Это можно сделать в новых версиях Excel на вкладке Формулы - Диспетчер имен (Formulas - Name manager) или в старых версиях - через меню Вставка - Имя - Присвоить (Insert - Name - Define):
- диапазону номеров (A1:A100) - имя NameCount
- всему списку с номерами (A1:B100) - имя NameList
Теперь осталось выбрать из списка NameList все элементы имеющие номер - это и будут наши уникальные представители. Сделать это можно в любой пустой ячейке соседних столбцов, введя туда вот такую формулу с известной функцией ВПР (VLOOKUP) и скопировав ее вниз на весь столбец:
=ЕСЛИ(МАКС(NameCount)<СТРОКА(1:1);"";ВПР(СТРОКА(1:1);NameList;2))
или в английской версии Excel:
=IF(MAX(NameCount)
Эта формула проходит сверху вниз по столбцу NameCount и выводит все позиции списка с номерами в отдельную таблицу:
Ссылки по теме
- Выделение дубликатов по одному или нескольким столбцам в списке цветом
- Запрет ввода повторяющихся значений
- Извлечение уникальных значений при помощи надстройки PLEX
=ИНДЕКС($B$2:$B$25;НАИМЕНЬШИЙ(ЕСЛИ(ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0)=СТРОКА($1:$24);ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0);"";);СТРОКА()-1);1)
=ИНДЕКС($B$2:$B$25;НАИМЕНЬШИЙ(ЕСЛИ(ЕСЛИОШИБКА(ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0);"";)=СТРОКА($1:$24);ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0);"";);СТРОКА()-1);1)
в ячейку N2, например:
формула массива
=ИНДЕКС($B$2:$B$25;НАИМЕНЬШИЙ(ЕСЛИ(ЕСЛИОШИБКА(ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0);"")=СТРОКА($1:$24);ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0);"");СТРОКА()-1);1)
Напишите пожалуйста вашу формулу так чтобы ее было полностью видно.
формула массива (так как формула длинная и не влазит в ширину страницы- два пробела поставил, нужно будет убрать)
=ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$25;НАИМЕНЬШИЙ(ЕСЛИ(ЕПУСТО($B$2:$B$25)=ЛОЖЬ; ЕСЛИ(ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0)=СТРОКА($1:$24);ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;
0);"");"");СТРОКА()-1);1);"")
=ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$25;
НАИМЕНЬШИЙ(ЕСЛИОШИБКА(ЕСЛИ(ПОИСКПОЗ($B$2:$B$25;$B$2:$B$25;0)=СТРОКА()-1;
СТРОКА()-1;"");"");СТРОКА()-1));"")
Решение сложных задач посредством формул достаточно трудно воспринимается со стороны, так как формула может содержать до 5 и более уровней вложения. Сам не раз, пытаясь разобраться в чьей-то формуле тратил немало времени на ее разбор, но оно того стоит. Лучше разобраться в алгоритме работы формулы, нежели просто вставить готовую в свой документ, тогда работа формулы для изучающего ее упрощается.
P.S. При вставке формулы нужно удалить лишние пробелы.
Правильно:
Ключ коллекции должен быть уникален, иначе возникает ошибка, которую можно обработать. Получается что-то типа
Моя проблемма заключается в том, что когда я извлекаю дубликаты, ячейки удаляются, и идет несоответствие со слобцом который рядом.
У меня получился только как - сначала преобразую таблицу в диапазон, вставляю формулу, потом снова преобразую в таблицу
что я делаю не так в третьем примере ?
Ругается при вводе описанной выше формулы
=IF(COUNTIF(B$1:B2;B2)=1;MAX(A$1:A1)+1;"")
Либо проблема глубже, но без файла - не понять.
Вопрос такой: есть столбец в 4 тысячи строк, примерно. Количество повторений в нем достаточно велико.
Так вот, как удалить дубликаты так, чтобы сам диапазон не смещался? То есть, чтобы остались пустые ячейки на месте дубликатов?
Подскажите пожалуйста решение данной проблемы:
есть файл с двумя закладками "Export Products Sheet (2)"-основные данные с перечнем ассортимента продукции (более 15 000) и "Export Groups Sheet" с основными двумя колонками "Номер группы" и "Название группы". Задача: отобразить в первой закладке, в ячейках столбца "Р" (это номер группы) ссылаясь на сопоставление данных столбца "Х" (индификатор группы) со второй закладкой столбца "В" (название группы) в результате чего в первой закладке в ячейках столбца "Р" будут отображаться данные второй закладки ячеек столбца "А". названия значений в ячейках столбца "Х" идентичны значениям ячеек столбца "В".(текстовые к примеру Aveo).
С одной ячейкой я справился с помощью формулы: =ЕСЛИ(X2='Export Groups Sheet'!B4;'Export Groups Sheet'!A4)
Но со всем массивом не смог.(
Помогите, если не трудно.
А как получить в сухом остатке строки изначально уникальные, т.е. представленные в единственном экземпляре? Рецепт актуален и для Excel 2003.
Идею уже не новую (и ранее благополучно прошляпленную) я нашел здесь:
g "uniq -u" site:ru-board.com
Нужна утилита uniq из набора UnxUtils или UnxUpdates. Добавляем путь к ней в PATH.
Затем
Годится и для csv.
Ключ -i может быть полезен.
А без ключа -u будет другой коленкор (то, что Excel считает уникальным)
Поясню:
Если чем нарушил правила форума нещадно вымарывайте.
Подскажите пожалуйста, как сделать чтобы формула =ЕСЛИ(МАКС(NameCount)<СТРОКА(1:1);"";ВПР(СТРОКА(1:1);NameList;2)) стала рабочей если диапазон откуда извлекаются уникальные значения был на одном листе, а сами уникальные значения появлялись на другом листе. Причем таблица из которой извлекаются значения является динамической и ей присвоено имя
---------------------
Да хоть на другом листе, хоть на листе другого файла. Самое главное при назначении диапазонов NameCount и NameList - начинайте делать их в целевом листе (куда будете собирать уникальные значения), переходя при указании данных на лист из которого берете данные.
Необходимо вместо формулы =ЕСЛИ(СЧЁТЕСЛИ(B$1:B2;B2)=1;МАКС(A$1:A1)+1;"";) написать в A2 значение "1"(без формул), а дальше формула выглядит: ЕСЛИ(СЧЁТЕСЛИ(B$1:B3;B3)=1;B2+1;B2). Так получается, может не так красиво, так как столбец будет выглядеть:1,2,2,2,2,2,2,3,3,3,3,3.... но вторая формула будет работать, так как ВПР подтягивает в таком случае, по первому вхождению значения(что нам и надо).
Также, может МАКС(Nameout) внести в какую-либо ячейку, и постоянно на неё ссылаться? Я точно не знаю, но так может быть быстрее (чем в каждой строке заново рассчитывать).
Взял за основу Ваш 3-й вариант. Вот что получилось:
=ИНДЕКС(A$1:A$10000;ЕСЛИ(СЧЁТЕСЛИ(A$1:A2;A2)=1;СТРОКА(A2);""))
Работает по тому же принципу. То есть, сначала СЧЁТЕСЛИ проверяет сколько раз встречался пункт и если он уникален (встречался =1 раз), то формула ЕСЛИ выдает номер строки уникального значения. А ИНДЕКС выдает значение находящееся в диапазоне А1:А10000 на нужной строке.
Интересно почитать комментарии.
В общем вот.
Вариант 1.
=ЕСЛИ(ЕОШИБКА(ИНДЕКС(А$1:А$10000;ЕСЛИ(СЧЁТЕСЛИ(А$1:А4;А4)=1;СТРОКА(А4);"";)));"-";ИНДЕКС(А$1:А$10000;ЕСЛИ(СЧЁТЕСЛИ(А$1:А4;А4)=1;СТРОКА(А4);"";)))
Здесь есть два жирных минуса:
- она НЕ выносит отдельно уникальные значения, она просто заменяет не уникальные на "-"
- она не подойдет для работы с данными, т.к. при изменении первоначального списка (к примеру, фильтрация по алфавиту) конечный результат тоже будет меняться
Вариант 2=ЕСЛИ(ЕОШИБКА(ПОИСКПОЗ(ИНДЕКС(A$1:B10000;ПОИСКПОЗ(СТРОКА(1:1);A:A;0);3);$C$1:$C1;0));ИНДЕКС(A$1:B10000;ПОИСКПОЗ(СТРОКА(1:1);A:A;0);3);0)
Этой формулой проблема с изменением списка уников решена. Но сохранилась замена не уникальных (теперь на 0) и появилось 2 условия использования:
- исходный список должен быть нумерованным
- и список с результатами обязательно должен начинаться со второй строки (в данном случае с С2)
Ладно, в общем буду пока думать над этой задачей. Вот так и учусь excel'ю потихонькуПодскажите, пожалуйста, как можно создать уникальный список из диапазона в 128 столбцов и 11000 строк, когда во всех ячейках значения в виде больничных кодов, то есть нет заголовков и других критериев (не считая пустых ячеек)?
Буду премного благодарна.
2)=ЕСЛИОШИБКА(ВПР(СТРОКА(A1);A:B;2;0);"";)