Вот возможное улучшение вашего кода (объяснение в комментариях)
Option Explicit
Sub Selectrows()
Dim lastrow As Long
Dim cel As Range
Dim destSht As Worksheet
Set destSht = Worksheets("myDestinationSheetName") '<-- change "myDestinationSheetName" to your actual destination sheet name
With Worksheets("mySourceSheetName") ' reference source sheet - change "mySourceSheetName" to your actual source sheet name
lastrow = .Range("E" & .Rows.Count).End(xlUp).Row ' get referenced sheet column E last not empty cell row index
For Each cel In .Range("H4:H" & lastrow).SpecialCells(xlCellTypeFormulas) ' loop through referenced sheet column H cells cointaining formulas from row 4 down to column E las not empty one
If cel.Value >= 2.5 Then cel.Offset(-1, 0).Resize(3, 1).EntireRow.Copy Destination:=destSht.Cells(destSht.Rows.Count, 1).End(xlUp).Offset(1)
Next
End With
End Sub
, как вы видите, я предлагаю
, чтобы использовать With .. End With block
для ссылки на конкретный c объект (в данном случае Worksheets("mySourceSheetName")
) и внутри него используйте точки (.) Перед каждым его дочерним элементом (например, Range, Cells,…), чтобы убедиться, что они принадлежат указанному объекту
для использования SpecialCells()
метода объекта Range
для фильтрации только ячеек с «постоянным» (т.е. не производным от формул) содержимым
для использования .Offset()
свойство для смещения объекта диапазона, к которому он вызывается (в данном случае cel
) на одну строку вверх и нуля в сторону
для использования свойства .Resize()
для расширения объекта диапазона вызывается (cel.Offset(-1,0)
в данном случае) на три строки по высоте и один столбец по ширине