【问题标题】:Is it possible to split cells with line breaks into multiple rows in a range?是否可以将带有换行符的单元格拆分为一个范围内的多行?
【发布时间】:2016-10-18 11:55:28
【问题描述】:

我有一个数据范围,其中一些单元格有换行符,我需要将换行符拆分为出现换行符的下方的行,但保持其他单元格不变。如果有区别的话,还有多列。

我使用了下面提供的两个答案,并进行了一些调整以适合我的工作表,但都不适用于拆分所有单元格。最后我什至都尝试了,但这也不起作用。

当A列有换行符时,它正在工作,但是当A列中没有换行符,并且在另一列中有换行符时,它不起作用。如果A列中没有换行符,我只需要将有换行符的行拆分并合并到下面的行中。

代码如下:

end_row = range("A" & Rows.count).End(xlUp).row

range("A:A").TextToColumns Destination:=range("a1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, OtherChar _
    :="   ", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

For i = 1 To end_row
    row_added = False
    For j = 1 To 4
        If InStr(1, Cell, Chr(10)) <> 0 Then
            If Not row_added Then
                Rows(i + 1).Insert
                row_added = True
                end_row = end_row + 1
            End If
            Cells(i + 1, j) = Right(Cells(i, j), Len(Cells(i, j)) - InStr(1, Cell, Chr(10)))
            Cells(i, j) = Left(Cells(i, j), InStr(1, Cell, Chr(10)) - 1)
        End If
    Next j
Next i

Sub LFtoRow()
Dim myWS As Worksheet, myRng As range
Dim LastRow As Long, iLoop As Long, jLoop As Long
Dim myString() As String

Set myWS = ActiveSheet
LastRow = myWS.Cells(myWS.Rows.count, 1).End(xlUp).row

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 1), Chr(10))
    If UBound(myString, 1) > 0 Then
        myWS.Rows(iLoop + 1 & ":" & iLoop + UBound(myString, 1)).Insert shift:=xlShiftDown
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 1) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

End Sub

要么是一个完全的新代码,要么只是在最后添加一些东西。我有一个正在发生的事情的例子,我希望它看起来像下面。 (我知道它在照片中显示 B 列,但此时在 MACRO 中它位于 A 列中)

发生了什么:

我需要发生的事情:

【问题讨论】:

  • 尝试split 换行?不知道它的语法是什么 XD
  • 您可以将该字符串用作 TextToColumns 中的 OtherChar,而不是替换“”。这应该会节省一些代码行。
  • 作为记录,如果这是一次性任务,您可以使用 Text To Columns 在新行分隔符上拆分数据。您只需(在另一个分隔符文本框中)在键入 010 时按住 ALT。 10 是换行符也就是 Excel 换行符的 UNICODE 值。
  • @MarkBalhoff 列。我需要行。

标签: vba excel line-breaks


【解决方案1】:

我会推荐类似于以下的代码来解决您的问题。它具有以下属性:

  1. 在 Chr(10) 上使用 Split 函数来确定每行所需的字符串。 Chr(10) 是换行符。 Split 会为您生成一个字符串数组。
  2. 为您插入正确的行数。
  3. 自下而上循环遍历您的范围,以便您处理整个范围。

代码...

Sub LFtoRow()
Dim myWS As Worksheet, myRng As Range
Dim LastRow As Long, iLoop As Long, jLoop As Long
Dim myString() As String

Set myWS = Worksheets("Sheet1")
LastRow = myWS.Cells(myWS.Rows.Count, 1).End(xlUp).Row

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 1), Chr(10))
    If UBound(myString, 1) > 0 Then
        myWS.Rows(iLoop + 1 & ":" & iLoop + UBound(myString, 1)).Insert Shift:=xlShiftDown
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 1) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

End Sub

当出现此输入时...

...生成这个结果...

【讨论】:

  • 有没有办法使用它并检查多个列?我从你那里得到的一个我相信只拆分 A 列,另一个也没有拆分所有单元格。
  • 当然可以。但是,要求并不明确。 1)你想检查所有列的数据吗? 2)如果两列在同一行中有换行符怎么办?你想插入一两行吗? 3) 是否需要将特定的行数据放在同一行上?
  • 我为不够具体而道歉。但是,我确实相信我得到了它来做我需要它做的事情。本质上,我需要它来检查所有有数据的列,如果同一行的多列中有换行符,则只插入一行并将所有列拆分到该行中。对于您的最后一个问题,我并不完全确定您的意思,但是一行中的所有数据都保留在一行中是相关的,这就是为什么换行符首先给我带来了一个问题,如果这是有道理的。我相信这回答了你的问题。
  • 我确信有更简洁的方法可以做到这一点,但我使用了你提供的公式,只是用它来检查每一列,对于通过第一列的列,不要插入一个新行,但只需将数据向下移动到下面的行中。其中,可能会导致一些并发症,但我相信出口的运作方式,它不应该产生任何问题。如果您看到我使用您的代码提供的答案,它会显示我所做的确切操作。谢谢!
【解决方案2】:

这很可能不是最简洁的方法,但最终使用@OldUgly 的代码对我有用。

Sub LFtoRow()
Dim myWS As Worksheet, myRng As range
Dim LastRow As Long, iLoop As Long, jLoop As Long
Dim myString() As String

Set myWS = ActiveSheet
LastRow = myWS.Cells(myWS.Rows.count, 1).End(xlUp).row

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 1), Chr(10))
    If UBound(myString, 1) > 0 Then
        myWS.Rows(iLoop + 1 & ":" & iLoop + UBound(myString, 1)).Insert shift:=xlShiftDown
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 1) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 2), Chr(10))
    If UBound(myString, 1) > 0 Then
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 2) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 3), Chr(10))
    If UBound(myString, 1) > 0 Then
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 3) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 4), Chr(10))
    If UBound(myString, 1) > 0 Then
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 4) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

For iLoop = LastRow To 1 Step -1
    myString = Split(myWS.Cells(iLoop, 5), Chr(10))
    If UBound(myString, 1) > 0 Then
        For jLoop = 0 To UBound(myString, 1)
            myWS.Cells(iLoop + jLoop, 5) = myString(jLoop)
        Next jLoop
    End If
Next iLoop

End Sub

【讨论】:

    【解决方案3】:

    这是我的建议,应该处理所有列中的换行符。

    我还删除了插入“;”的替换然后分裂。完整的代码将是:

    end_row = Range("A" & Rows.Count).End(xlUp).Row
    
    Range("A:A").TextToColumns Destination:=Range("a1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, OtherChar _
        :="   ", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
    
    For i = 1 To end_row
        row_added = False
        For j = 1 To 4
            If InStr(1, Cell, Chr(10)) <> 0 Then
                If Not row_added Then
                    Rows(i + 1).Insert
                    row_added = True
                    end_row = end_row + 1
                End If
                Cells(i + 1, j) = Right(Cells(i, j), Len(Cells(i, j)) - InStr(1, Cell, Chr(10)))
                Cells(i, j) = Left(Cells(i, j), InStr(1, Cell, Chr(10)) - 1)
            End If
        Next j
    Next i
    

    【讨论】:

    • Fredrik,我最终使用了 OldUgly 的公式。在我看来,好像您删除了“;”然后在换行符上拆分成列?但是后来你的代码读取了插入行,所以我很困惑。我没有对其进行测试,但我非常感谢您在这方面的时间!
    • @JRivs 在您的代码中,您首先将 "=SUBSTITUTE(RC[-1],"" "", "";"")" 放入 coulmn B. 然后根据 ";" 进行拆分.我直接在 "" "" 上进行了拆分,以节省创建新列、复制和粘贴值以及删除 A 列的额外步骤。换行部分在 for 循环中。你可以只使用循环。
    • @JRivs OldUgly 的代码仅处理 A 列中的换行符。我的查看所有列。两者都工作正常。
    • 它不工作。我不知道它是在我尝试调整它时发生的,还是从一开始就不起作用。这就像部分工作,但不是全部。此外,它没有在“”上拆分,所以我最终不得不重新插入我的“替换为;”代码。
    猜你喜欢
    • 2019-07-03
    • 2018-10-02
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多