真の最終行を取得する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万超!)まで罫線が設定されたりしていたら、おっそろしいことになるんよなあ……。