Консолидация данных из столбцов в строки

3

У меня есть таблица:

Company 1 | ID1
Company 1 | ID2
Company 1 | ID3
Company 2 | ID4
Company 2 | ID5
Company 2 | ID6
Company 3 | ID7
Company 3 | ID8
Company 3 | ID9

Мне нужно объединить каждую компанию в один ряд со всеми их идентификаторами в столбцах справа. В каждой компании может быть разное количество идентификаторов.

Конечный результат будет выглядеть так:

Company 1 | ID1 | ID2 | ID3
Company 2 | ID4 | ID5 | ID6
Company 3 | ID7 | ID8 | ID9

Как я мог сделать это? Желательно с VBA.

Oliver Yasuna
источник
Если вы можете добавить столбец для таблицы, попробуйте Power Query: chuantu.biz/t6/335/1530177159x-1404792307.gif
Lee

Ответы:

2

Это решение с единой формулой предполагает, что каждая компания имеет одинаковое количество строк:

Worksheet Screenshot

Введите следующую формулу в D2 и ctrl-enter / copy-paste / fill-down & amp; прямо в остальной части таблицы:

=""&INDEX($A:$B,ROW($D$2)+3*INT(ROW()-ROW($D$2))+MAX(0,COLUMN()-COLUMN($D$2)-1),2-(COLUMN()=COLUMN($D$2)))

Обратите внимание, что эта формула будет работать для любого (идентичного) числа строк для каждой компании и будет корректно корректироваться при добавлении / удалении строк или столбцов.

Однако формула будет нарушена, если таблица, в которой она находится, будет скопирована / вырезана и вставлена ​​в другое место. $D$2 Необходимо изменить ее, чтобы она соответствовала верхней левой ячейке данных нового местоположения таблицы, чтобы она снова работала правильно.


Если для каждой компании существует переменное количество строк, требуется одна формула:

=IFERROR(IF(COLUMN()=COLUMN($D$2),""&INDEX($A:$A,MATCH(D1,$A:$A,0)+COUNTIF($A:$A,D1)),INDEX(INDEX($B:$B,MATCH($D2,$A:$A,0)):INDEX($B:$B,MATCH($D2,$A:$A,0)+COUNTIF($A:$A,$D2)-1),COLUMN()-COLUMN($D$2))),"")

Worksheet Screenshot

robinCTS
источник
Спасибо. А если есть неизвестное количество строк?
Oliver Yasuna
@OliverYasuna Я добавил формулу в ответ для этого случая
robinCTS
1

Вот альтернатива VBA:

'============================================================================================
' Module     : <any standard module>
' Version    : 0.1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://superuser.com/a/1335738/763880
'============================================================================================
Option Explicit

Public Sub UnPivot()
       Dim ¡ As Long

  Const s_SourceColumns As String = "A:B"
  Const s_TargetColumn As String = "D"
  Const b_HasHeader As Boolean = True

  Dim lngSourceRows As Long
  lngSourceRows = ActiveSheet.Columns(s_SourceColumns).Cells(Rows.Count, 1).End(xlUp).Row + CLng(b_HasHeader)
  Dim varSource As Variant
  varSource = ActiveSheet.Columns(s_SourceColumns).Resize(RowSize:=lngSourceRows + 1).Offset(RowOffset:=-CLng(b_HasHeader)).Value2
  Dim idxNewCompany As Long: idxNewCompany = LBound(varSource, 1)
  Dim strNewCompany As String: strNewCompany = varSource(idxNewCompany, 1)
  Dim varUnPivotedData() As Variant
  ReDim varUnPivotedData(1 To lngSourceRows)
  varUnPivotedData(1) = strNewCompany
  Dim celNextTargetStart As Range
  Set celNextTargetStart = ActiveSheet.Columns(s_TargetColumn).Resize(RowSize:=1).Offset(RowOffset:=-CLng(b_HasHeader))
  Application.ScreenUpdating = False
  For ¡ = LBound(varSource, 1) To UBound(varSource, 1) - 1
    varUnPivotedData(¡ - idxNewCompany + 2) = varSource(¡, 2)
    If varSource(¡ + 1, 1) <> strNewCompany Then
      ReDim Preserve varUnPivotedData(1 To ¡ - idxNewCompany + 2)
      celNextTargetStart.Resize(ColumnSize:=UBound(varUnPivotedData)).Value2 = varUnPivotedData
      Set celNextTargetStart = celNextTargetStart.Offset(RowOffset:=1)
      idxNewCompany = ¡ + 1
      strNewCompany = varSource(idxNewCompany, 1)
      ReDim varUnPivotedData(1 To lngSourceRows)
      varUnPivotedData(1) = strNewCompany
    End If
  Next ¡
  Application.ScreenUpdating = True

End Sub

Просто измените константы в верхней части кода в соответствии с вашей ситуацией.

robinCTS
источник
-1

enter image description here

Как это устроено:

  • Выберите A2: A11 и назовите диапазон КОМПАНИЯ ,
  • Выберите B2: B11 и назовите диапазон идентификаторы ,
  • Запишите эту формулу массива в ячейке C2 для создать уникальный список компаний :

    {=INDEX($A$2:$A$11, MATCH(0, COUNTIF($C$1:C1, $A$2:$A$11), 0))}
    

Нотабене Завершите приведенную выше формулу Ctrl + Shift + Enter & Амп; заполните его.

  • Запишите эту формулу массива в ячейке D2, завершите Ctrl + Shift + Enter а также заполните прямо тогда вниз.

    {=IFERROR(INDEX(IDs,SMALL(IF(Company=$C2,ROW(IDs)-MIN(ROW(IDs))+1),COLUMNS($C$2:C2))),"")}
    

Заметка,

  • Эта формула будет работать гладко, если есть переменная номер идентификаторов для каждой компании.

  • Вы получите список идентификаторов в столбцах, как показано на снимке экрана.

Rajesh S
источник
Что не так с этой формулой, так как она работает правильно !!
Rajesh S