Find the last not empty row in a range of cells holding a formula Find the last not empty row in a range of cells holding a formula vba vba

Find the last not empty row in a range of cells holding a formula


I think that more elegant way than was provided by @D_Bester is to use find() option without looping through the range of cells:

Sub test()    Dim cl As Range, i&    Set cl = Range("E1:E" & Cells(Rows.Count, "E").End(xlUp).Row)    i = cl.Find("*", , xlValues, , xlByRows, xlPrevious).Row    Debug.Print "Last row with data: " & iEnd Sub

test

enter image description here

Also, more shorter version of the code which was provided above is:

Sub test2()    Debug.Print [E:E].Find("*", , xlValues, , xlByRows, xlPrevious).RowEnd Sub


You want to find the last cell in a column that is not empty AND is not a blank string("").

Just follow the LastRow with a loop checking for a non-blank cell.

lastrow = ActiveSheet.Range("E" & ActiveSheet.Rows.Count).End(xlUp).RowDo    If ActiveSheet.Cells(lastrow, 5).Value <> "" Then        Exit Do    End If    lastrow = lastrow - 1Loop While lastrow > 0If lastrow > 0 Then    Debug.Print "Last row with data: " & lastrowElse    Debug.Print "No data in the column"End If

Notice that your Rows.count does not specify which sheet. That means it will use the active sheet. Of course ActiveSheet.Range() also is on the active sheet. But it is bad practice to mix Range or Rows with .Range or .Rows. It indicates a thoughtless usage that could bite you if you changed the ActiveSheet but didn't change the unspecified reference.


This should help you determine the last row containing a formula (in column A on sheet1 Sheet1):

lastRow  = Split(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ",")(UBound(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ","))), "$")(2)

SpecialCells is used to determine the range of all the cells containing a formula. This range is then parsed using Split. With Ubound the last of these cells is being retrieved. The result is being split again to extract the row number.