Я проверил этот код, и он, кажется, работает нормально. Для этого вам нужно выбрать «Данные-а» в начальном списке данных, то есть в верхней левой ячейке.
Существует три процедуры:
- InsertNewRows: просто вставляется необходимое количество пустых новых строк
- ReplicateData: заполняет пустые строки правильными данными
- TransformData: это основная процедура, которая проходит по каждой строке, для которой требуется репликация
Sub InsertNewRows(TargetRow As Integer, TargetCol As Integer, Reps As Integer)
Dim iRep As Integer
For iRep = 1 To Reps - 1
Cells(TargetRow + iRep, TargetCol).EntireRow.Insert Shift:=xlDown
Next iRep
End Sub
Sub ReplicateData(TargetRow As Integer, TargetCol As Integer, Reps As Integer)
Dim iRep As Integer
For iRep = 1 To Reps - 1
With Cells(TargetRow, TargetCol)
.Offset(iRep, 0).Value = .Value
.Offset(iRep, 1).Value = .Offset(0, 1).Value
.Offset(iRep, 2).Value = .Offset(0, 2).Value + iRep
.Offset(iRep, 3).Value = .Offset(0, 3).Value
End With
Next iRep
End Sub
Sub TransformData()
Dim nRows As Long
nRows = ActiveCell.CurrentRegion.Rows.Count
Dim StartingRow As Integer
Dim StartingColumn As Integer
Dim NumberOfReplications As Integer
Dim RowOffset
StartingRow = ActiveCell.Row
StartingColumn = ActiveCell.Column
NumberOfReplications = 0
RowOffset = 0
Dim iIterations As Integer
For iIterations = 1 To nRows
If Not VBA.IsEmpty(Cells(StartingRow + RowOffset, StartingColumn)) Then
NumberOfReplications = Cells(StartingRow + RowOffset, StartingColumn).Offset(0, 3)
InsertNewRows StartingRow + RowOffset, StartingColumn, NumberOfReplications
ReplicateData StartingRow + RowOffset, StartingColumn, NumberOfReplications
RowOffset = RowOffset + NumberOfReplications
End If
Next iIterations
End Sub