Excel将具有多行的单元格拆分为整个表的行

时间:2019-05-14 21:23:09

标签: excel vba

在Excel(2016)中,我有一些看起来像这样的数据:

enter image description here

基于特定列,在此示例中为“ IPAddress”列,如果单元格中有多行,则将字符串分成新行,并将剩余数据复制到该行。

这是我在脚本或完成后所要寻找的东西。

enter image description here

我正在使用来自Split cell with multiple lines into rows

的以下代码
    Sub tes_5()


    Dim cell_value As Variant
    Dim counter As Integer

    'Row counter
    counter = 1

    'Looping trough A column define max value
    For i = 1 To 10

        'Take cell at the time
        cell_value = ThisWorkbook.ActiveSheet.Cells(i, 1).Value

        'Split cell contents
        Dim WrdArray() As String
        WrdArray() = Split(cell_value, vbLf)

        'Place values to the B column
        For Each Item In WrdArray
            ThisWorkbook.ActiveSheet.Cells(counter, 2).Value = Item
            counter = counter + 1
        Next Item


    Next i
End Sub

这会分隔IPAddress列,但不会在新行中添加其他单元格的数据。

文本到列不起作用,Power Query(https://www.quora.com/Is-there-a-way-in-excel-to-bulk-split-cells-with-multiple-lines-inside-into-new-rows-without-overwriting-the-existing-data-below)也不起作用。

还有其他建议吗?

更新: 刚刚了解到,默认情况下,Excel在定界符字段的开头放置了一个逗号,这导致我在选择换行时定界符不起作用。 enter image description here

如果删除前导逗号,则“应该”(就像我一样),即可获得所需的结果。

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试此操作,假设您的数据以A2开始:

Sub x()

Dim r As Long, v As Variant

For r = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
    v = Split(Cells(r, 4), vbLf)
    If UBound(v) > 0 Then
        Cells(r + 1, 1).Resize(UBound(v), 4).Insert shift:=xlDown
        Cells(r + 1, 1).Resize(UBound(v), 3).Value = Cells(r, 1).Resize(, 3).Value
        Cells(r, 4).Resize(UBound(v) + 1).Value = Application.Transpose(v)
    End If
Next r

End Sub

答案 1 :(得分:1)

使用Power Query非常简单

您需要做的就是将IPAddress列按换行符拆分为行

用户界面中的“拆分列”对话框

enter image description here

M代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Server Name", type text}, {"Serial Number", type text}, {"OS", type text}, {"IPAddress", type text}}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Changed Type", {{"IPAddress", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "IPAddress")
in
    #"Split Column by Delimiter"

enter image description here