Geoff:
There are some caveats that should be noted about your FAQ:
First, the ‘UsedRange’ function returns just that, the area of the sheet that is in use. So, if you open a new sheet and only place data in ‘C3’ and ‘E5’ then your FindLastRow routines return 3 instead of 5. To return the row number of the last row in the used range you need to modify your code to this:
r = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
Second, the UsedRange and Cells.SpecialCells(xlCellTypeLastCell) functions suffer from the same design choice within Excel. Excel considers any cell that it is tracking information for as being ‘used’. Therefore, if you unlock a cell, change its format, or enter data and then clear the cell, Excel will include that cell within the areas considered by these functions. A good discussion on this issue and ranges in general is given at:
This discussion also gives Microsoft’s function to find the last real cell containing data:
Sub GetRealLastCell()
Dim lRealLastRow As Long
Dim lRealLastColumn As Long
Range("A1"

.Select
On Error Resume Next
lRealLastRow = Cells.Find("*", Range("A1"

, xlFormulas, , xlByRows, xlPrevious).Row
lRealLastColumn = Cells.Find ("*",Range("A1"

, xlFormulas, , xlByColumns, xlPrevious).Column
Cells(lRealLastRow, lRealLastColumn).Select
End Sub
Regards,
Ron