Об'єднання даних із стовпців у рядки


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.


Якщо ви можете додати стовпець для таблиці Power, спробуйте запит Power: 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)))

Зауважте, що ця формула буде працювати для будь-якої (ідентичної) кількості рядків для кожної компанії і буде правильно налаштовуватися, якщо додано / видалено рядки або стовпці.

Однак, формула зламається, якщо таблиця, в якій вона знаходиться, копіюється / вирізається і вставляється в інше місце. The $D$2 Необхідно змінити значення s, щоб вони відповідали верхній лівій комірці даних розташування таблиці, щоб знову працювати правильно.


Якщо для кожної компанії існує змінна кількість рядків, потрібна одна формула:

=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


Дякую. А якщо є невідома кількість рядків?
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

Просто змініть константи у верхній частині коду, щоб відповідати вашій ситуації.


-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))}
    

N.B. Закінчити над написаною формулою з Ctrl + Shift + Enter & amp; заповнити його.

  • Напишіть цю формулу масиву в осередку D2, завершіть Ctrl + Shift + Enter і заповніть, а потім вниз.

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

Примітка,

  • Ця формула працюватиме плавно, у випадку, якщо існує змінна кількість ідентифікаторів для кожної компанії.

  • Ви отримаєте список ідентифікаторів у стовпцях, як показано на знімку екрана.


Що неправильно з цією Формулою з це працює належним чином !!
Rajesh S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.