/ / Чи можна розділити комірки з розривами рядків на кілька рядків у діапазоні? - excel, vba, excel-vba, рядкові перерви

Чи можна розділити клітинки з розбиттями рядків на декілька рядків у діапазоні? - excel, vba, excel-vba, лінійні перерви

У мене є діапазон даних, де частина комірокмати розриви рядків, і мені потрібно розділити рядкові перерви на рядки внизу, де відбувається перерив рядка, але залишити інші комірки як є. Існує також кілька стовпців, якщо це має значення.

Я використав два відповіді, подані нижче, з деякими коригуваннями, щоб відповідати моєму робочому аркушу, але жоден не працює для розбиття ВСІХ комірок. Я закінчила навіть спроби обох, але і це не працює.

Коли в стовпці А є розрив рядка, він єпрацює, але коли в стовпці 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 для відповіді № 1

Я б рекомендував код, подібний до наступного, щоб вирішити вашу проблему. Він має такі властивості:

  1. Використовує функцію розділення на Chr (10) для визначення потрібних рядків у кожному рядку. Хр (10) - символ передачі ліній. Спліт створює для вас масив рядків.
  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

Коли представлений цей вхід ...

введіть опис зображення тут

... генерує цей результат ...

введіть опис зображення тут


0 для відповіді № 2

Ось моя пропозиція, яка повинна обробляти розриви рядків у всіх стовпцях.

Також я видалив заміну, яка вставляє ";" а потім розпадається на це. Повний код буде:

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 для відповіді № 3

Це, швидше за все, не самий стислий спосіб зробити це, але це закінчилося для мене, використовуючи код @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