真の最終行を取得するFunctionの修正
前回の
にさっそくツッコミがw
@excelspeedupさん曰く、
currentregion使うと、完全な空白行が入っているとき誤動作しませんか?
と。
ははは。確かにおっしゃるとおり。
場合分けミスですな。
たとえば、

こんなふうにデータ(笑)が入っていたとして、

こんなふうに行を選択して

非表示にされてしまったら、

こんなふうに意図しない行番号が返ってしまう。
「真の最終行番号」の看板に偽りありですがな。
コードの修正
というわけで、前回のリスト1を次のように修正する。
リスト1 標準モジュール
Public Function getLastRowNumber( _
ByVal targetColumn As Long, _
Optional ByVal targetSheet As Worksheet) As Long
If targetSheet Is Nothing Then Set targetSheet = ActiveSheet
Dim tmpLastRow As Long
'暫定的な最終行を求める'
tmpLastRow = getLastRowNumberNormal(targetColumn:=targetColumn, _
targetSheet:=targetSheet)
'UsedRangeの最終行番号を求める'
Dim maxRowNumber As Long
maxRowNumber = targetSheet.UsedRange.Rows.Count '……(*)'
'tmpLastRowとmaxRowNumberが一致していれば、それが最終行'
If tmpLastRow = maxRowNumber Then getLastRowNumber = tmpLastRow: Exit Function
'maxRowNumberの方が大きい場合は、真の最終行を探す'
Dim i As Long
For i = maxRowNumber To tmpLastRow Step -1
With targetSheet
If .Cells(i, targetColumn).Value <> "" Then
getLastRowNumber = i
Exit Function
End If
End With
Next
End Function
'指定した列の最終行を返す'
Public Function getLastRowNumberNormal( _
ByVal targetColumn As Long, _
Optional ByVal targetSheet As Worksheet) As Long
If targetSheet Is Nothing Then Set targetSheet = ActiveSheet
getLastRowNumberNormal = targetSheet.Cells(Rows.Count, targetColumn).End(xlUp).Row
End Function
変えたのは(*)のところだけ。
単純に、UsedRangeの最終行番号をmaxRowNumberにぶち込むようにしただけ。
ちなみに、

この状態でイミディエイト・ウインドウに
?Activesheet.UsedRange.Rows.Count
と入力して[Enter]を押すと、

ご覧のように「23」が返る。非表示にしているのも「使用中」ということらしい。
使ってみる
イミディエイト・ウインドウに
?getLastRowNumber(Range("P1").Column)
と入力して[Enter]を押す。

今度は「21」が返った。

ご名算!
おわりに
ただ、UsedRangeを使うと、意味もなく最終行(100万超!)まで罫線が設定されたりしていたら、おっそろしいことになるんよなあ……。