The Last Row
- To get the last row in a column i.e. the row of the last non-empty cell, you want to make sure that the worksheet is not filtered. Then you can freely use the Findmethod in the way illustrated in the following codes.
- If you want to find the last non-blank row e.g. you want to exclude cells containing formulas evaluating to ""at the bottom of your data, you will usexlValuesinstead ofxlFormulas.
- xlFormulaswill work even if rows are hidden (not filtered) while- xlValueswill not.
A Quick Fix (Not Recommended)
lrow = Worksheets("Sheet1").Columns("A").Find("*", , xlFormulas, , , xlPrevious).Row
Last Row
Sub CalculateLastRow()
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    If ws.FilterMode Then ws.ShowAllData
    
    Dim lRow As Long
    
    With ws.Range("A2")
        Dim lCell As Range: Set lCell = .Resize(ws.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If Not lCell Is Nothing Then lRow = lCell.Row
    End With
    
    If lRow = 0 Then
        Debug.Print "No data found."
    Else
        Debug.Print "The last row is row " & lRow & "."
    End If
End Sub
Range (more useful)
Sub ReferenceRange()
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    If ws.FilterMode Then ws.ShowAllData
       
    Dim rg As Range
    
    With ws.Range("A2")
        Dim lCell As Range: Set lCell = .Resize(ws.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If Not lCell Is Nothing Then Set rg = .Resize(lCell.Row - .Row + 1)
    End With
    If rg Is Nothing Then
        Debug.Print "No data found."
    Else
        Debug.Print rg.Address(0, 0)
    End If
End Sub
Q&A
- Q: What does the following mean? - With ws.Range("A2")
    Set ... = .Resize(ws.Rows.Count - .Row + 1)   
End With
 
- A: It's a way to reference the range - A2:A1048576(- A2:A65536in older
versions), the range to be searched in.
 
- Q: What does the following mean? - .Find("*", , xlFormulas, , , xlPrevious)
 
- A: It means that there are only 3 arguments necessary for this operation: 1st - - What, 3th -- LookIn, and 6th -- SearchDirection. The default parameter of the 2nd argument,- After, is the first cell of the range (in this case- A2), the 4th argument,- LookAt, is irrelevant since we're using a wild card, while the 5th argument,- SearchOrderis irrelevant when performing this operation in a single column or single row. The last 3 arguments (from a total of 9) aren't worth mentioning.