Excel - условно транспонировать строки в столбцы - PullRequest
0 голосов
/ 30 мая 2019

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

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)  

...

Ответы [ 2 ]

1 голос
/ 30 мая 2019

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

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

Результаты:

enter image description here

1 голос
/ 30 мая 2019

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

enter image description here

  • Формула в A2:

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

    Введите через Ctrl Shift Введите

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

  • Формулав 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))),"")
    

    Введите через Ctrl Shift Введите

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

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

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

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