windows - Konverter multi-line Excel-gruppe til individuelle linjer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et Excel-dokument med grupper og brugernavne i et sådant format:


Group1          user1
                user2
                user3
Group2          user2
                user4
Group3          user5


etc.etc. Hver af grupperne er en enkelt række, med alle brugere som en multiline post i en celle.


Jeg har brug for det at være i et enkelt linieformat, så jeg kan eksportere det som en CSV og gøre noget nyttigt med det.


Jeg bryder mig ikke om, hvordan det bliver forvandlet (excel hotkey, python script, uanset), men det skal se ud:


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

Bedste reference


Ikke sikker på at jeg skulle svare på mit eget spørgsmål, men en kollega kunne levere svaret.


Ved hjælp af VBS kunne jeg oprette et modul, der gjorde specifikt det, jeg havde brug for. Koden er nedenfor, hvor iColumn-variablen er kolonnen med de multiline data.


Kreditt for koden går til http://excel.tips.net/T003263\_Splitting\_Information\_into\_Rows.html[5]


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

Andre referencer 1


Medmindre jeg har misforstået opgaven, kan koden til at få jobbet være meget enklere. Det skal fungere:


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