是否有可能使用换行符分割单元格到一个范围内的多行?

我有一个数据范围,其中一些单元格有换行符,我需要将换行符分割成行换行符下面的行,但保留其他单元格。 也有多个列,如果这有所作为。

我已经使用了下面提供的两个答案,通过一些调整来适合我的工作表,但都不是用于拆分所有的单元格。 我甚至尝试了两个,但是这也不起作用。

当列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列中)

发生什么事:

在这里输入图像说明

我需要发生的事情: 在这里输入图像说明

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

  1. 使用Split函数在Chr(10)上确定每行所需的string。 Chr(10)是换行字符。 Split为您生成一个string数组。
  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 

当提供这个input…

在这里输入图像说明

…产生这个结果…

在这里输入图像说明

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

另外我删除了replace,插入一个“;” 然后分裂。 完整的代码将是:

 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 

这最有可能不是最简洁的方式来做到这一点,但这最终使用@ 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