2016-06-16 57 views
0

我有一個數據範圍,其中一些單元格有換行符,我需要將換行符分成行下面出現行的位置,但保持其他單元格不變。如果這有所改變,也會有多個列。是否可以使用換行符將單元格拆分爲多個行?

我已經使用了下面提供的兩個答案,一些調整適合我的工作表,但都不適用於拆分所有單元格。我甚至嘗試了兩種方法,但那也行不通。

當列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列)

正在發生的事情:

enter image description here

我需要發生: enter image description here

+0

在換行符上試試'split'?不知道是什麼語法雖然XD – findwindow

+0

而不是替代「」你可以使用該字符串作爲TextToColumns中的OtherChar。這應該保存一些代碼行。 – Fredrik

+0

爲了記錄,如果這是一次性任務,則可以使用「文本到列」將數據分隔到新的行分隔符處。你只需要(在另一個分隔符文本框中)按住'ALT'鍵的同時鍵入'010'。 10是換行又名Excel新行字符的UNICODE值。 –

回答

0

這最有可能是沒有做到這一點的最簡潔的方式,但是這結束了我使用@ 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 
1

我會推薦類似於下面的代碼來解決你的問題。它具有以下屬性:

  1. 使用Split函數在Chr(10)上確定每行所需的字符串。 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 

當用該輸入呈現...

enter image description here

...產生此結果...

enter image description here

+0

有沒有辦法使用它並檢查多個列?我從你那裏得到的那只是分裂A列,我相信,另外一個也不會分裂所有的細胞。 – Excellerator

+0

當然。但是,要求並不明確。 1)你想檢查所有的數據列嗎? 2)如果兩列在同一行有一個換行符會怎樣?你想插入一行還是兩行? 3)是否需要將特定的行數據放在同一行上? – OldUgly

+0

我很抱歉沒有足夠具體。但是,我相信我已經做到了我需要的。實質上,我需要它檢查所有有數據的列,如果在同一行的多個列中存在換行,只插入一行並將所有列拆分到該行中。對於你的最後一個問題,我不完全確定你的意思,但是將一行中的所有數據保留在一行中是恰當的,這就是爲什麼如果有意義的話,換行是首先引起我一個問題的原因。我相信這回答了你的問題。 – Excellerator

0

這是我的建議,應該處理所有列中的換行符。

另外我刪除了替換,插入一個「;」然後再分裂。完整的代碼將是:

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 
+0

Fredrik,我最終使用了OldUgly的公式。在我看來,你好像刪除了「;」然後在行中拆分成列?但是,然後你的代碼讀插入行,所以我只是困惑。我沒有測試它,但我非常感謝你的時間! – Excellerator

+0

@JRivs在您的代碼中,您首先執行了「= SUBSTITUTE(RC [-1],」「」「,」「;」「)」「,然後根據」;「進行分割。我insted直接拆分「」「」以保存創建新列,複製和粘貼值並刪除列A的額外步驟。換行符部分位於for循環中。你可以使用循環。 – Fredrik

+0

@JRivs OldUgly的代碼只處理列A中的換行符。我的所有列都會查找。兩者都很好。 – Fredrik

相關問題