Этот код делает то, что вам нужно - учтите, что у меня нет четко определенных ссылок на ячейки, поскольку мы основываемся на ActiveCell, я оставил диапазоны как Range
, а не worksheet.Range
Sub x()
Do While ActiveCell.Value2 <> ""
If InStr(1, ActiveCell.Value2, ",") > 0 Or InStr(1, ActiveCell.Value2, "-") > 0 Then e
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Sub e()
Dim a As Long
Dim r As Long
Dim c As Long
Dim rc As Long
Dim i As Long
Dim j As Long
Dim x() As String
Dim t() As String
x = Split(ActiveCell, ",")
r = ActiveCell.Row
c = ActiveCell.Column
For i = LBound(x) To UBound(x)
If InStr(1, x(i), "-") Then
a = a + Split(x(i), "-")(1) - Split(x(i), "-")(0)
End If
Next i
a = a + UBound(x)
Range(Cells(r + 1, c), Cells(r + a, c)).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
For i = LBound(x) To UBound(x)
t = Split(x(i), "-")
If UBound(t) = 0 Then
Cells(r + rc, c).Value2 = t(0)
rc = rc + 1
Else
For j = t(0) To t(1)
Cells(r + rc, c).Value2 = j
rc = rc + 1
Next j
End If
Next i
Range(Cells(r, c - 3), Cells(r + rc - 1, c - 1)).Value2 = _
Range(Cells(r, c - 3), Cells(r, c - 1)).Value2
End Sub
Это в основном заполняет этот столбец один за другим на основе чисел x,y,a-b,z
, разделяя сначала на ,
, а затем на любые экземпляры -
После этого у него уже есть счетчик строкrc
так что просто используйте этот счетчик для заполнения диапазона сверху вниз, дублируя значения в 3 столбцах перед активной ячейкой
РЕДАКТИРОВАТЬ: я добавил 5 строк, которые фактически проходят через диапазоны (1,2,4-7 как угодно), чтобы подсчитать, сколько строк до INSERT
до фактического заполнения информации.
EDIT2: я добавил еще одну подпрограмму под названием x
, чтобы сделать этот цикл e
, пока он не достигнет ячейкив нем ничего нет ... Итак, чтобы исправить весь лист, просто выделите самую верхнюю ячейку с диапазоном, например (1,3,4-7 ... и т. д.), и запустите процедуру x