В общем, это действительно не очень хороший вопрос, , поскольку он не соответствует правилам StackOverflow , но, тем не менее, это некоторый возможный ответ, выдающий такой вывод:
Public Sub TestMe()
Dim myCell As Range
Dim currentCell As Range: Set currentCell = Range("D1")
Dim rangeToWrite As Range: Set rangeToWrite = Columns("D:E")
Dim lastRow As Long: lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Dim myRng As Range: Set myRng = Range(Cells(1, 1), Cells(lastRow, 1))
Dim stayLeft As Boolean: stayLeft = True
rangeToWrite.Clear
For Each myCell In myRng
If Len(myCell) Then
If stayLeft Then
stayLeft = False
If currentCell.Address <> Range("D1").Address Then
Set currentCell = currentCell.Offset(1, -1)
End If
currentCell = myCell
Else
Set currentCell = currentCell.Offset(0, 1)
With rangeToWrite
If currentCell.Column > .Columns(.Columns.Count).Column Then
Set currentCell = currentCell.Offset(0, -1)
currentCell = currentCell & vbCrLf & myCell
Else
currentCell = myCell
End If
End With
End If
Else
stayLeft = True
End If
Next myCell
End Sub
Код довольно "хитрый" (или неприятный), но он работает.И такие вещи, как rangeToWrite.Columns(rangeToWrite.Columns.Count).Column
, могут заставить разработчиков VBA начать ненавидеть VBA еще больше.
Что делает код?
- Читает одну за другой ячейки первого столбца
ActiveSheet
; - Если ячейка пуста, она обновляет
stayLeft
до false.Это означает, что следующее значение будет записано в левом столбце Range("D:E")
; - . Оно записывает значение либо в левом, либо в правом столбце;
- Если пробелов нетпродолжает записывать все значения в правый столбец, конкатенируя с предыдущим значением;
Нажмите F8 , это легче увидеть, чем объяснить!