Преобразование многострочной группы Excel в отдельные строки - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть документ Excel с именами групп и имен пользователей в таком формате:

Group1          user1
                user2
                user3
Group2          user2
                user4
Group3          user5

и т. Д.Каждая из групп представляет собой одну строку со всеми пользователями в виде многострочной записи внутри ячейки.

Мне нужно, чтобы она была в формате одной строки, поэтому я могу экспортировать ее как CSV и сделать что-то полезноес ним.

Мне все равно, КАК он преобразуется (Excel Hotkey, Python скрипт, что угодно), но он должен выглядеть так:

Group1         user1
Group1         user2
Group1         user3
Group2         user2
Group2         user4
Group3         user5

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Если я не понял задачу, код для выполнения работы может быть намного проще. Это должно работать:

Sub ungrouper()

    'Assumes that users column does not contain blank cells.

    Dim users() As Variant
    Dim groups() As Variant
    Dim rngUsers As Range
    Dim rngGroups As Range

    Dim j As Integer
    Dim k As Integer

    'Change Column to match layout of your workbook.
    Set rngUsers = Range("B1", Range("B1").End(xlDown))
    users = rngUsers

    j = 1
    k = 1

    'Change column offset to match the layout of your workbook.
    Set rngGroups = rngUsers.Offset(0, -1)
    groups = rngGroups

    Do While j <= UBound(users)
        If groups(j, 1) = Empty Then
            groups(j, 1) = groups(j - 1, 1)
        End If
        j = j + 1
    Loop

    rngGroups.Value = groups

End Sub
0 голосов
/ 07 апреля 2011

Не уверен, что я должен отвечать на свой вопрос, но коллега смог дать ответ.

Используя VBS, я смог создать модуль, который делал именно то, что мне было нужно. Код ниже, где переменная iColumn - это столбец с многострочными данными.

Кредит за код идет на http://excel.tips.net/T003263_Splitting_Information_into_Rows.html

Sub CellSplitter1()
    Dim Temp As Variant
    Dim CText As String
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer
    Dim iColumn As Integer
    Dim lNumCols As Long
    Dim lNumRows As Long

    iColumn = 2

    Set wksSource = ActiveSheet
    Set wksNew = Worksheets.Add

    iTargetRow = 0
    With wksSource
        lNumCols = .Range("IV1").End(xlToLeft).Column
        lNumRows = .Range("A65536").End(xlUp).Row
        For J = 1 To lNumRows
            CText = .Cells(J, iColumn).Value
            Temp = Split(CText, Chr(10))
            For K = 0 To UBound(Temp)
                iTargetRow = iTargetRow + 1
                For L = 1 To lNumCols
                    If L <> iColumn Then
                        wksNew.Cells(iTargetRow, L) _
                          = .Cells(J, L)
                    Else
                        wksNew.Cells(iTargetRow, L) _
                          = Temp(K)
                    End If
                Next L
            Next K
        Next J
    End With
End Sub
...