Excel - условно транспонировать строки в столбцы

У меня есть выдержка из онлайн-таблицы, где она выложена:

1   date   author   modified   comment
1   date   author   modified   comment2
1   date   author   modified   comment3
1   date   author   modified   commentn
2   date   author   modified   comment
2   date   author   modified   comment2
2   date   author   modified   comment3
2   date   author   modified   commentn
3   date   author   modified   comment
3   date   author   modified   comment2
3   date   author   modified   comment3
3   date   author   modified   commentn
....
3000 date   author modified   comment60

Количество комментариев, связанных с каждым индексом, варьируется, и у нас есть несколько тысяч строк. На всю жизнь я не могу понять, как транспонировать их с помощью формулы

Любые мысли о том, как я могу добиться этого в Excel?

Я хотел бы, чтобы это было изложено как:

1 author concat(date, comment)  concat(date, comment)  concat(date, comment)  
2 author concat(date, comment)  concat(date, comment)  concat(date, comment)  

...

Таким образом, автор будет таким же со всеми экземплярами для одного идентификатора?

JvdV 30.05.2019 09:26
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
306
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один из способов с использованием некоторых формул:

  • Формула в A2:

    =IFERROR(INDEX(Sheet1!$A$1:$A$12,MATCH(0,COUNTIF($A$1:A1,Sheet1!$A$1:$A$12),0)),"")
    

    Вход через CtrlShiftEnter

    Тянуть вниз...

  • Формула в B2:

    =INDEX(Sheet!$C$1:$C$12,MATCH(A2,Sheet1!$A$1:$A$12,0))
    

    Тянуть вниз...

  • Формула в C2:

    =IFERROR(INDEX(Sheet1!$B$1:$B$12,SMALL((Sheet1!$A$1:$A$12=$A2)*ROW(Sheet1!$A$1:$A$12),COUNTIF(Sheet1!$A$1:$A$12,"<>"&$A2)+(COLUMN()-2)))&", "&INDEX(Sheet1!$E$1:$E$12,SMALL((Sheet1!$A$1:$A$12=$A2)*ROW(Sheet1!$A$1:$A$12),COUNTIF(Sheet1!$A$1:$A$12,"<>"&$A2)+(COLUMN()-2))),"")
    

    Вход через CtrlShiftEnter

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

И если это вернет вам числа вместо дат, то поменяйте эту часть: INDEX(Sheet1!$B$1:$B$12 на: INDEX(TEXT(Sheet1!$B$1:$B$12,"DD-MM-YYYY") или любой другой формат даты, который вы можете использовать.

Ваш первый шаг может также просто скопировать первые столбцы идентификаторов на лист1, вставить их на лист2 и удалить дубликаты. В этом случае вам придется настроить диапазоны в других формулах, чтобы они начинались с A1 вместо A2.

Спасибо - это сработало для меня после настройки столбцов - у меня было несколько разных авторов, которых я хотел сгруппировать, поэтому я смог это сделать.

Scott 31.05.2019 02:34

Вы можете попробовать:

Option Explicit

Sub test()

    Dim LastRowA As Long, i As Long, Count As Long, j As Long, k As Long, LastRowG As Long, LastColumn As Long, StartingPoint As Long
    Dim arr As Variant
    Dim strAuthor As String, strNextAuthor As String, strFullRecord As String

    With ThisWorkbook.Worksheets("Sheet1")

        LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row

        arr = .Range("A1:E" & LastRowA)

        StartingPoint = 1

        For i = LBound(arr) To UBound(arr)

            If StartingPoint = i Then

                j = i + 1

                strAuthor = arr(i, 1)
                strNextAuthor = arr(j, 1)

                    Do Until strAuthor <> strNextAuthor

                        j = j + 1

                        If j > LastRowA Then
                            Exit Do
                        Else
                            strNextAuthor = arr(j, 1)
                        End If

                    Loop

                LastRowG = .Cells(.Rows.Count, "G").End(xlUp).Row

                If LastRowG = 1 And .Range("G1").Value = "" Then
                    LastRowG = 1
                Else
                    LastRowG = LastRowG + 1
                End If

                For k = i To j - 1

                    LastColumn = .Cells(LastRowG, .Columns.Count).End(xlToLeft).Column

                    If .Range("G" & LastRowG).Value = "" Then
                        .Range("G" & LastRowG).Value = arr(k, 1)
                        .Range("H" & LastRowG).Value = arr(k, 3)
                        .Range("I" & LastRowG).Value = "(" & arr(k, 2) & ", " & arr(k, 5) & ")"
                    Else
                        .Cells(LastRowG, LastColumn + 1) = "(" & arr(k, 2) & ", " & arr(k, 5) & ")"
                    End If

                Next k

                StartingPoint = j

            End If

        Next i

    End With

End Sub

Результаты:

Я не мог заставить это работать, но я попробую еще раз сегодня днем! Спасибо вам обоим!

Scott 31.05.2019 02:36

Другие вопросы по теме