Line numbers are easy to handle -- the function FindLastRowWithData
'backs up' the used range until it finds a row with more than MaxNumCellsUsed (default = 1) of cells with something in them and assumes that that is the row where data endsCode:
Function LastRowWithData(ws As Worksheet, Optional MaxNumCellsUsed As Long = 1) As Long
Dim i As Long
For i = ws.UsedRange.Rows.Count To 1 Step -1
If Application.WorksheetFunction.CountA(ws.Rows(i)) > MaxNumCellsUsed Then
LastRowWithData = i
Exit Function
End If
Next i
End Function
The For loops than can stop checking at that row since that's the end of 'meaningful' data