"Это должно продолжаться, пока диапазон не будет пустым." Мой код ниже копирует весь диапазон, но не удаляет оригинал, как кажется из ваших описаний. Однако это должно быть довольно просто, если требуется - просто добавьте WsS.Cells.ClearContents
в конце.
Тем временем код выполняет то, что вы описываете. Количество строк, которые нужно скопировать в одну l oop, можно задать в верхней части процедуры. Я установил Const BlockRowCount As Long = 3
, делая 3 строки в al oop. Это также будет работать для 7000 строк.
Я заметил, что ваш код не копирует A1 в A1. Const FirstTargetCell As String = "B3"
определяет верхнюю левую ячейку на листе назначения как B3. Вы можете указать любую ячейку в этом месте, и код будет зависать от данных этого колышка.
Sub TransferData()
Const BlockRowCount As Long = 3
' cell A1 from the source sheet will arrive at
' FirstTargetCell on the target sheet. All other data relative to it.
Const FirstTargetCell As String = "B3" ' modify as required
Dim WsS As Worksheet ' Source sheet
Dim WsT As Worksheet ' Target sheet
Dim Src As Range ' source data range
Dim Tgt As Range ' target data range
Dim Arr As Variant ' data array
Dim Rl As Long, Cl As Long ' last used row / column
Dim Ct As Long ' first Target column
Dim Rs As Long, Rt As Long ' source / target row
Dim R As Long
Set WsS = Worksheets("Source Data")
Set WsT = Worksheets("Destination")
With Range(FirstTargetCell)
Rt = .Row
Ct = .Column
End With
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
With WsS
Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
Cl = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Rs = 0 To Abs(Int(Rl / BlockRowCount * -1)) - 1
R = Application.Min((Rs + 1) * BlockRowCount, Rl)
Set Src = .Range(.Cells(Rs * BlockRowCount + 1, 1), _
.Cells(R, Cl))
Arr = Src.Value
With WsT
Set Tgt = .Cells(Rt, Ct).Resize(UBound(Arr), UBound(Arr, 2))
Tgt.Value = Arr
End With
Rt = Rt + BlockRowCount
Next Rs
End With
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub