Слияние двух списков без дубликатов
Классическая ситуация: у вас есть два списка, которые надо слить в один. Причем в исходных списках могут быть как уникальные элементы, так и совпадающие (и между списками и внутри), но на выходе нужно получить список без дубликатов (повторений):
Давайте традиционно рассмотрим несколько способов решения такой распространенной задачи — от примитивных «в лоб» до более сложных, но изящных.
Способ 1. Удаление дубликатов
Можно решить задачу самым простым путем — руками скопировать элементы обоих списков в один и применить потом к полученному набору инструмент Удалить дубликаты с вкладки Данные (Data — Remove Duplicates):
Само-собой, такой способ не подойдет, если данные в исходных списках часто меняются — придется повторять всю процедуру после каждого изменения заново.
Способ 1а. Сводная таблица
Этот способ является, по сути, логическим продолжением предыдущего. Если списки не очень большого размера и заранее известно предельное количество элементов в них (например, не больше 10), то можно объединить две таблицы в одну прямыми ссылками, добавить справа столбец с единичками и построить по получившейся таблице сводную:
Как известно, сводная таблица игнорирует повторы, поэтому на выходе мы получим объединенный список без дубликатов. Вспомогательный столбец с 1 нужен только потому, что Excel умеет строить сводные по таблицам, содержащим, по крайней мере, два столбца.
При изменении исходных списков новые данные по прямым ссылкам попадут в объединенную таблицу, но сводную придется обновить уже вручную (правой кнопкой мыши — Обновить). Если не нужен пересчет «на лету», то лучше воспользоваться другими вариантами.
Способ 2. Формула массива
Можно решить проблему формулами. В этом случае пересчет и обновление результатов будет происходить автоматически и мгновенно, сразу после изменений в исходных списках. Для удобства и краткости давайте дадим нашим спискам имена Список1 и Список2, используя Диспетчер имен на вкладке Формулы (Formulas — Name Manager — Create):
После именования, нужная нам формула будет выглядеть следующим образом:
На первый взгляд выглядит жутковато, но, на самом деле, все не так страшно. Давайте я разложу эту формулу на несколько строк, используя сочетание клавиш Alt+Enter и отступы пробелами, как мы делали, например тут:
Логика тут следующая:
- Формула ИНДЕКС(Список1;ПОИСКПОЗ(0;СЧЁТЕСЛИ($E$1:E1;Список1); 0) выбирает все уникальные элементы из первого списка. Как только они заканчиваются — начинает выдавать ошибку #Н/Д:
- Формула ИНДЕКС(Список2;ПОИСКПОЗ(0;СЧЁТЕСЛИ($E$1:E1;Список2); 0)) аналогичным образом извлекает уникальные элементы из второго списка.
- Вложенные друг в друга две функции ЕСЛИОШИБКА реализуют вывод сначала уникальных из списка-1, а потом из списка-2 друг за другом.
Обратите внимание, что это формула массива, т.е. после набора ее нужно ввести в ячейку не обычным Enter, а сочетанием клавиш Ctrl+Shift+Enter и затем скопировать (протянуть) вниз на нижестоящие ячейки с запасом.
В английской версии Excel эта формула выглядит как:
=IFERROR(IFERROR(INDEX(Список1, MATCH(0, COUNTIF($E$1:E1, Список1), 0)), INDEX(Список2, MATCH(0, COUNTIF($E$1:E1, Список2), 0))), «»)
Минус у такого подхода в том, что формулы массива ощутимо замедляют работу с файлом, если в исходных таблицах большое (несколько сотен и более) количество элементов.
Способ 3. Power Query
Если в ваших исходных списках большое количество элементов, например, по несколько сотен или тысяч, то вместо медленной формулы массива лучше использовать принципиально другой подход, а именно — инструменты надстройки Power Query. Эта надстройка по умолчанию встроена в Excel 2016. Если у вас Excel 2010 или 2013, то ее можно отдельно скачать и установить (бесплатно).
Алгоритм действий следующий:
- Открываем отдельную вкладку установленной надстройки Power Query (если у вас Excel 2010-2013) или просто идем на вкладку Данные (если у вас Excel 2016).
- Выделяем первый список и жмем кнопку Из таблицы/диапазона (From Range/Table). На вопрос про создание из нашего списка «умной таблицы» — соглашаемся:
- Открывается окно редактора запросов, где будет видно загруженные данные и имя запроса Таблица1 (можно поменять на свое, если хотите).
- Делаем двойной щелчок в заголовок таблицы (слово Список1) и переименовываем на любой другой (например Люди). Каки именно назвать — не важно, но придуманное название нужно запомнить, т.к. его придется использовать потом еще раз при импорте второй таблицы. Объединить две таблицы в дальнейшем получится только если заголовки их столбцов совпадают.
- Разворачиваем выпадающий список в левом верхнем углу Закрыть и загрузить и выбираем Закрыть и загрузить в… (Close&Load to…):
- В следующем диалоговом окне (оно может выглядеть немного по-другому — не пугайтесь) выбираем Только создать подключение (Only create connection):
- Повторяем всю процедуру (пункты 2-6) для второго списка. При переименовании заголовка столбца важно использовать то же имя (Люди), что и в предыдущем запросе.
- В окне Excel на вкладке Данные (Data) или на вкладке Power Query выбираем Получить данные — Объединить запросы — Добавить (Get Data — Merge Queries — Append):
- В появившемся диалоговом окне выбираем наши запросы из выпадающих списков:
- В итоге получим новый запрос, где два списка будут соединены друг под другом. Осталось удалить дубликаты кнопкой Удалить строки — Удалить дубликаты (Delete Rows — Delete Duplicates):
- Готовый запрос можно переименовать справа на панели параметров, дав ему вменяемое имя (это будет имя таблицы-результата по факту) и все и можно все выгружать на лист командой Закрыть и загрузить (Close&Load):
В будущем, при любых изменениях или дополнениях в исходных списках, достаточно будет лишь правой кнопкой мыши обновить таблицу результатов.
Ссылки по теме
- Как собрать несколько таблиц из разных файлов с помощью Power Query
- Извлечение уникальных элементов из списка
- Как сравнить два списка между собой на совпадения и отличия
Иногда для удобства требуется объединить три и более списка значений в один.
Пусть дано 5 списков и все они разной длины (см. Файл примера ).
Задача
Объединим все значения из 5 списков в один. Задача объединения 2-х списков решена в одноименной
статье
.
Решение1 (Простое)
Объединенный спискок будем строить на основе функции СМЕЩ()
=СМЕЩ(заголовок первого списка;Номер элемента в списке;Номер списка-1)
Создадим небольшую служебную таблицу для подсчета количества значений в каждом списке и определения позиции первого элемента каждого списка в объединенном списке.
Эта таблица позволит нам сопоставить каждой позиции объединенного списка Номер исходного списка:
=ГПР(СТРОКА()-СТРОКА($H$11);$B$7:$F$8;2;ИСТИНА)
- выражение СТРОКА()-СТРОКА($H$11) генерирует последовательность 1; 2; 3; 4…
- функция ГПР() — горизонтальный аналог ВПР() выбирает по позиции первого элемента каждого списка в объединенном списке номер исходного списка.
Номер списка является смещением по столбцам в формуле на основе СМЕЩ()
Подробности можно посмотреть в файле примера на листе Пример2.
Решение2 (сложное, с формулами массива и именованными формулами)
Сначала создадим
именованный диапазон
, содержащий значения из всех списков. Для этого:
-
выделите, диапазон
A
2:
E
10
; -
на вкладке
Формулы
в группе
Определенные имена
выберите команду
Присвоить имя
; -
в поле
Имя
введите:
Диапазон_Списков
; -
убедитесь, что в поле
Диапазон
введена формула =пример!$A$2:$E$10 - нажмите ОК.
Для вывода всех значений из 5 списков в один столбец будем использовать функцию ИНДЕКС() . Эта функция будет последовательно выводить значения из всех ячеек диапазона
Диапазон_Списков
на основании их номера столбца и номера строки. Осталось только определить адреса не пустых ячеек.
Создадим массив пар (номер столбца; номер строки) для всех ячеек диапазона. Для этого применим трюк: значения пары будем хранить в виде обычного числа, но формировать его будем по определенному правилу: правая часть числа будет содержать номер строки (для этого выделяется два разряда, т.е. максимальная длина списка может быть 99), а левая часть числа будет содержать номер столбца. Например, число 512 будет означать: 5-й столбец, 12-ая строка. Естественно, при необходимости можно увеличить разрядность для хранения номеров строк (формула из файла примера позволяет столбцам иметь до 9999 строк).
Технически осуществим это так. Сначала определим номер столбца и строки левого верхнего угла нашего
Диапазона_Списков
. Для этого создайте две
именованные формулы
=МИН(СТОЛБЕЦ(Диапазон_Списков)) и =МИН(СТРОКА(Диапазон_Списков))
Создайте еще одну
именованную формулу
Адреса:
=ЕСЛИ(ЕПУСТО(Диапазон_Списков);»»; —((СТОЛБЕЦ(Диапазон_Списков)-Мин_Столбец+1)&ВЫБОР(ДЛСТР(СТРОКА(Диапазон_Списков)-Мин_Строка+1);»0″;»»)&СТРОКА(Диапазон_Списков)-Мин_Строка+1))
Эта формула вернет массив адресов из нашего диапазона {101;201;301;401;501: 102;202;302;»»;502: 103;203;303;»»;503: 10…}. Вместо адресов пустых ячеек в массиве содержатся значения
Пустой текст
(«»). Номера столбцов и строк отсчитываются от левой верхней ячейки
Диапазона_список
.
Заключительный этап. Формируем объединенный список. Запишем в ячейке следующую формулу: =ЕСЛИОШИБКА(ИНДЕКС(Диапазон_Списков; —ПРАВСИМВ(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1));2);—ЛЕВСИМВ(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1)); ДЛСТР(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1)))-2));»»)
Функция НАИМЕНЬШИЙ() будет последовательно извлекать все числа, содержащие адреса ячеек. Функция ПРАВСИМВ() будет извлекать из этих чисел номер строки, а функция ЛЕВСИМВ() – номер столбца. Эти две функции возвращают текстовые значения, поэтому применим двойное отрицание (—), чтобы преобразовать текст в число (см. статью
Преобразование чисел из текстового формата в числовой (часть 1)
).
Таким образом можно объединить нужное количество столбцов, каждый из которых длиной не более 99 строк.
Для объединения столбцов, каждый из которых длиной не более 9999 строк нужно использовать формулу
=ЕСЛИОШИБКА(ИНДЕКС(Диапазон_Списков;—ПРАВСИМВ(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1));4);—ЛЕВСИМВ(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1));ДЛСТР(НАИМЕНЬШИЙ(Адреса;СТРОКА(Z1)))-4));»»)
Именованную формулу
Адреса
также придется подкорректировать:
=ЕСЛИ(ЕПУСТО(Диапазон_Списков);»»;—((СТОЛБЕЦ(Диапазон_Списков)-Мин_Столбец+1)&ВЫБОР(ДЛСТР(СТРОКА(Диапазон_Списков)-Мин_Строка+1);»000″;»00″;»0″;»»)&СТРОКА(Диапазон_Списков)-Мин_Строка+1))
Примечание
: при объединении большого количества столбцов с количеством строк >100, расчет формулы может притормаживать.
In this guide, we’re going to show you how to find all combinations of two lists in Excel by using Power Query.
Download Workbook
In our example, we have two lists that contain Pokémon names and we want to see the combinations of matched Pokémon.
We can join these two tables to compare them by using Get & Transform Data. Get & Transform Data feature consists of tools, previously known as Power Query. You can get more information about this here: Power Query 101.
Creating queries from tables
First step is to convert the tables into Power Query structure.
- Select one of your tables.
- Open the Data tab and click the corresponding icon under the Get & Transform Data section to get data from your workbook.
- (Microsoft 365 / Excel 2019) From Sheet
- (Excel 2016) From Table/Range
- (Excel 2010 / Excel 2013) Use Power Pivot tab instead of Data
- (Microsoft 365 / Excel 2019) From Sheet
- Clicking the button opens the Power Query Editor.
- Once you are done with the changes, click Custom Column in Add Column. We will add a helper column which will be a common point between the two tables.
- Enter a friendly name for your new column and enter =1 into the formula section.
- Click OK to save.
- After adding the helper column, return to the Home tab and click Close & Load To item in Close & Load list to see options.
- Make sure to select Only Create Connection in the Import Data This option will save the table as a connection rather that populating the queried data in the worksheet.
- Apply the same steps to the other table. At the end you should have two queries corresponding with your tables. You can see these tables in Queries & Connections pane in Excel.
Joining queries to find all combinations of two lists
Next step is to join (merge) the queries on a new table which will allow us to see any differences between the tables.
- Once the queries from the tables are ready, go to Data > Get Data > Combine Queries > Merge to open the Merge dialog of Power Query.
- Select each table in the drop downs.
- Click on the column for each table to select them.
- Finally select Full Outer option for Join Kind to join by all rows from both tables.
- Click OK to apply selections.
- You will see three columns after merging. The first one is the items of the first list. Right-click on the column in the middle and select Remove to delete the helper column.
- Click the button next to the column title.
- Make sure that the Expand option is selected in the popup menu.
- Uncheck the helper column.
- Uncheck Use original column as prefix.
- Click OK to populate the data of the second table.
- You will see the combinations in Power Query. When you are OK with the outcome, click Close & Load, this time to populate the entire data into your worksheet.
After populating the merged table, you can see all combinations of the two lists.
Типичная проблема — имеем два списка. Первый список — содержит объем продаж по менеджерам с фамилиями и суммами, другой содержит фамилии менеджеров и отделы к которым они относятся. Как в первый список быстро добавить название отдела, к которому относится менеджер, чтобы посмотреть продажи по отделу?
Файл | Описание | Размер файла: | Скачивания |
---|---|---|---|
Пример | 6 Кб | 2544 |
Графически эта задача выглядит, примерно, так:
Шаг 1
Приступаем к решению. Встаем в ячейку «D2» и вводим «=ВПР(«:
Шаг 2
Начинаем вводить аргументы функции: «Искомое_значение» (Что будем искать?) вводим ячейку, в которой содержится значение (фамилия), которое нам необходимо найти во второй таблице — «B2«:
Шаг 3
Ставим «;«. Следующий аргумент: «Таблица» (Где будем искать?) вводим диапазон второй таблицы, в которой мы будем искать значения (фамилии) из первой — «G6:H10«:
Шаг 4
Ставим «;«. Следующий аргумент: «Номер_столбца» (Из какого столбца подставлять данные?) вводим номер столбца, который содержит интересующие нас данные (отдел) так как этот столбец по счету слева — второй, вводим цифру «2«:
Шаг 5
Ставим «;«. Следующий аргумент: «Интервальный_просмотр» вводим слово «ЛОЖЬ«:
Шаг 6
Закрываем скобку и нажимаем «Enter«. Получаем результат — в ячейке «D2» мы получили название отдела «ОПТ»:
Шаг 7
Не торопитесь хлопать в ладоши и копировать формулу на нижние ячейки, не все так просто. Предварительно нужно заблокировать в формуле диапазон второй таблицы, чтобы он «не съехал» при копировании. Для этого встаем курсором мышки в поле формул и выделяем диапазон таблицы:
Шаг 8
Нажимаем на клавиатуре кнопку «F4«, перед буквами и цифрами диапазона должны будут появиться знаки «$«, если это произошло нажимаем клавишу «Enter«:
Шаг 9
Вот теперь можно копировать формулу на нижние ячейки и получать полноценный результат:
Добавить комментарий
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Еще…Меньше
Функция ОБЪЕДИНИТЬ объединяет текст из нескольких диапазонов и (или) строк, вставляя между текстовыми значениями указанный разделитель. Если в качестве разделителя используется пустая текстовая строка, функция эффективно объединит диапазоны.
Синтаксис
ОБЪЕДИНИТЬ(разделитель; игнорировать_пустые; текст1; [текст2]; …)
Аргумент |
Описание |
---|---|
Разделитель |
Текстовая строка (пустая или с символами в двойных кавычках) или ссылка на действительную текстовую строку. Введенные числа будут считаться текстом. |
ignore_empty |
В случае значения ИСТИНА игнорирует пустые ячейки. |
текст1 |
Элемент текста, который нужно присоединить. Текстовая строка или массив строк, например диапазон ячеек. |
[текст2, …] |
Дополнительные текстовые элементы для объединения. Для текстовых элементов можно указать до 252 аргументов, включая текст1. Каждый из них может быть текстовой строкой или массивом строк, например диапазоном ячеек. |
Например, выражение =ОБЪЕДИНИТЬ(» «;ИСТИНА; «Не»; «слышны»; «в»; «саду»; «даже»; «шорохи.») вернет строку Не слышны в саду даже шорохи.
Примечания
-
Если объединенная строка содержит более 32767 символов (ограничение для ячейки), функция ОБЪЕДИНИТЬ вернет ошибку #ЗНАЧ!.
Примеры
Скопируйте данные примеров из приведенных ниже таблиц и вставьте их в ячейку A1 нового листа Excel. Чтобы отобразить результаты формул, выделите их и нажмите клавишу F2, а затем — клавишу ВВОД. При необходимости измените ширину столбцов, чтобы видеть все данные.
Пример 1
Валюта |
|
---|---|
доллар США |
|
австралийский доллар |
|
китайский юань |
|
гонконгский доллар |
|
израильский шекель |
|
южнокорейская вона |
|
российский рубль |
|
Формула: |
=ОБЪЕДИНИТЬ(«, «; ИСТИНА; A2:A8) |
Результат: |
доллар США, австралийский доллар, китайский юань, гонконгский доллар, израильский шекель, южнокорейская вона, российский рубль |
Пример 2
A |
B’s |
---|---|
a1 |
b1 |
a2 |
b2 |
a4 |
b4 |
a5 |
b5 |
a6 |
b6 |
a7 |
b7 |
Формула: |
=ОБЪЕДИНИТЬ(«, «; ИСТИНА; A2:B8) |
Результат: |
a1, b1, a2, b2, a4, b4, a5, b5, a6, b6, a7, b7 Если в качестве значения аргумента «игнорировать_пустые» используется ЛОЖЬ, результат будет следующим: a1, b1, a2, b2, , , a4, b4, a5, b5, a6, b6, a7, b7 |
Пример 3
Город |
Субъект |
Индекс |
Страна |
---|---|---|---|
Тула |
Тульская обл. |
74133 |
Россия |
Красноярск |
Красноярский край |
98109 |
Россия |
Москва |
Московская обл. |
08830 |
Россия |
Хабаровск |
Хабаровский край |
33309 |
Россия |
Воронеж |
Воронежская обл. |
85285 |
Россия |
конец |
|||
, |
, |
, |
; |
Формула: |
=ОБЪЕДИНИТЬ(A8:D8; ИСТИНА; A2:D7) |
||
Результат: |
Тула,Тульская обл.,591843,Россия;Красноярск,Красноярский край,654321,Россия;Москва,Московская обл.,125130,Россия;Хабаровск,Хабаровский край,333091,Россия;Воронеж,Воронежская обл.,394000,Россия;конец |
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
См. также
Функция СЦЕПИТЬ
Функция СЦЕП
Общие сведения о формулах в Excel
Рекомендации, позволяющие избежать появления неработающих формул
Поиск ошибок в формулах
Сочетания клавиш и горячие клавиши в Excel
Текстовые функции (справочник)
Функции Excel (по алфавиту)
Функции Excel (по категориям)