вы могли бы использовать функцию, в которую вы передаете диапазон «семени» и возвращаете диапазон от пропущенной до последней непустой ячейки в том же столбце, как показано ниже (пояснения в комментариях)
Function GetRange(rng As Range) As Range
With rng.Parent ' reference passed range parent worksheet
Set GetRange = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp)) ' return referenced sheet range from passed range to passed range column last not empty cell
End With
End Function
для использования следующим образом:
Sub Test()
GetRange(Worksheets("Data").Range("O2")).Copy
End Sub
Вы можете улучшить функцию и заставить ее обрабатывать заданную «последнюю» строку
Function GetRange(rng As Range, Optional finalRow As Variant) As Range
With rng.Parent ' reference passed range parent worksheet
If IsMissing(finalRow) Then ' if no "final" row passed
Set GetRange = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp)) ' return referenced sheet range from passed range to passed range column last not empty cell
Else 'else
Set GetRange = .Range(rng, .Cells(finalRow, rng.Column)) ' return referenced sheet range from passed range to passed range column cell in give "final" row
End If
End With
для использования следующим образом:
Sub Test()
GetRange(Worksheets("Data").Range("O2"), 2).Copy
End Sub
, оставив «последний» ряд необязательным, можно использовать функцию с ее передачей или без нее:
Sub Test()
GetRange(Worksheets("Data").Range("O2")).Copy ' this will copy worksheet "Data" range from row 2 down to its column "O" last not empty row
GetRange(Worksheets("Data").Range("O2"), 3).Copy ' this will copy worksheet "Data" range from row 2 down to row 3
End Sub