真の最終行番号を取得するFunction(2)

真の最終行を取得するFunctionの修正

前回の

akashi-keirin.hatenablog.com

にさっそくツッコミがw

@excelspeedupさん曰く、

currentregion使うと、完全な空白行が入っているとき誤動作しませんか?

と。

ははは。確かにおっしゃるとおり。

場合分けミスですな。

たとえば、

f:id:akashi_keirin:20180301202430j:plain

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

f:id:akashi_keirin:20180301202442j:plain

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

f:id:akashi_keirin:20180301202452j:plain

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

f:id:akashi_keirin:20180301202500j:plain

こんなふうに意図しない行番号が返ってしまう。

「真の最終行番号」の看板に偽りありですがな。

コードの修正

というわけで、前回のリスト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にぶち込むようにしただけ。

ちなみに、

f:id:akashi_keirin:20180301202452j:plain

この状態でイミディエイト・ウインドウに

?Activesheet.UsedRange.Rows.Count

と入力して[Enter]を押すと、

f:id:akashi_keirin:20180301202514j:plain

ご覧のように「23」が返る。非表示にしているのも「使用中」ということらしい。

使ってみる

イミディエイト・ウインドウに

?getLastRowNumber(Range("P1").Column)

と入力して[Enter]を押す。

f:id:akashi_keirin:20180301202526j:plain

今度は「21」が返った。

f:id:akashi_keirin:20180301202535j:plain

ご名算!

おわりに

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

@akashi_keirin on Twitter