Excel: как собрать уникальные значения в одном столбце, которые связаны с дубликатами в другом столбце? - PullRequest
4 голосов
/ 20 марта 2020

С такими данными:

Column A     Column B
1               98
1               12
1               21 
1               31   
2               37
2               40
3               48 
4               34
4               88
4               74 
4               99
7               82
7               19
7               29
7               50 
7               95
7               85

, где все значения в Column B уникальны, а Column A имеет несколько дубликатов. Как я могу сгруппировать значения A в одном столбце и отобразить объединенные значения B в другом, например:

Column C   Column D
1             98,12,21,31
2             37,40
3             48
4             34,88,74,99
7             82,19,29,50,95,85

Я пробовал с комбинацией сцепления и индексации и сопоставления, но все это просто превращается в беспорядок.

Какие предложения были бы замечательно?

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

Во-первых, вам нужно извлечь уникальное значение из Column A в Column C. Вы можете сделать это с помощью метода Advance Filter или по следующей формуле.

=IFERROR(INDEX($A$2:$A$18,MATCH(0,INDEX(COUNTIF($C$1:C1,$A$2:$A$18),0,0),0)),"")

После извлечения уникальных значений необходимо использовать формулу TEXTJOIN() для агрегирования значений от Column B до Column D. У вас есть TEXTJOIN() формула в вашей версии Excel, тогда вы можете использовать ее, как показано ниже

=TEXTJOIN(", ",TRUE,IF($A$2:$A$18=C2,$B$2:$B$18,""))

В противном случае вам придется использовать VBA пользовательскую функцию, чтобы написать TextJoin() формулу. Для TEXTJOIN() пользовательских функций вы можете посмотреть этот пост. Опубликовать ссылку

enter image description here

3 голосов
/ 20 марта 2020

Позвольте мне добавить два дополнительных метода к ответу @ Harun24HR. Обе опции предполагают, что согласно вашим образцам данных у вас нет заголовков.


Опция 1) : Dynami c Функции массива

Когда у вас есть доступ для динамических c функций массива вы можете использовать следующее:

In C1:

=UNIQUE(A1:A17)

Эта UNIQUE функция будет разлив массив уникальных значений из определенного диапазона в столбец C.

In D1:

=TEXTJOIN(",",TRUE,FILTER(B$1:B$17,A$1:A$17=C1))

, тогда как FILTER извлечет все значения из столбца B, где совпадает столбец A, это TEXTJOIN, который объединит эти значения в желаемую строку.

Перетащите вниз ...


Вариант 2) : PowerQuery

Если вы хотите поэкспериментировать с PowerQuery / GetAndTransform , тогда вам не нужны никакие формулы или VBA для этого дело. Выполните следующие действия:

  • Выберите A1:B17 и на ленте выберите Data> From Table/Range в разделе «Получить и преобразовать данные»
  • Выберите для импорта данных без заголовков. Откроется новое окно.
  • На ленте нажмите Transform> Group By. В этом меню выберите «Группировать по столбцу 1», выберите имя нового столбца, например: «Сгруппированный», затем выберите «1057» в раскрывающемся списке «Операция» и нажмите OK.
  • . Вы заметите дополнительный столбец. Теперь на ленте нажмите Add Column> Custom Column и введите следующую формулу: Table.Column([Grouped], "Column2"). Это должно добавить третий столбец, который содержит список значений.
  • Удалить Grouped из таблицы. Затем нажмите значок справа от имени добавленного столбца, и у вас будет два варианта. Выберите Extract Values, затем выберите запятую в качестве разделителя.

Может быть ошибка перевода в М-коде ниже, но это должно быть так:

let
    Source = Excel.CurrentWorkbook(){[Name="Tabel1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", Int64.Type}, {"Column2", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Column1"}, {{"Grouped", each _, type table [Column1=number, Column2=number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.Column([Grouped], "Column2")),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    #"Removed Columns" = Table.RemoveColumns(#"Extracted Values",{"Grouped"})
in
    #"Removed Columns"

PowerQuery доступен в Excel-2010, если я не ошибаюсь, поэтому вам не потребуется доступ к расширенным формулам, таким как TEXTJOIN, для выполнения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...