サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

図形を含めた最下の行番号を取得する【Excel/VBA/最終行】

はじめに

 Excel VBA で、最も下の行が知りたいという要件はしばしばあります。

 取得する方法は、複数あります

 それぞれ一長一短がありますが、多くの人は自分の作っているワークシートの状況に応じて好みのものを使っていると思います。

図形が含まれると期待した動作にならない

 多くは「使われているセルで最後のものから行番号を取得する」というものです。しかしそれより下に図形があると、実際に印刷されるのはもう少し下の方になります。図形を含めた印刷範囲にかかる最後の行を知りたいという場合には、図形の座標を考慮する必要があります。

ソースコード

 図形を考慮した上で最下行の番号を取得する VBA のコード例は以下のようになります。

''' 図形を考慮した上で最下の行番号を返す
Public Function GetLastRow() As Long
    Dim lastBottom As Double
    lastBottom = GetLastBottom()
    
    Dim r As Long
    For r = ActiveSheet.Cells.SpecialCells(xlLastCell).Row To ActiveSheet.Rows.Count
        GetLastRow = r
        If ActiveSheet.Rows(r).Top + ActiveSheet.Rows(r).Height >= lastBottom Then
            Exit For
        End If
    Next
End Function

''' 図形を含めた最下の座標を返す
Private Function GetLastBottom() As Double
    Dim i As Long
    Dim maxY As Double
    maxY = 0#
    For i = 1 To ActiveSheet.Shapes.Count
        Dim y As Double
        y = ActiveSheet.Shapes(i).Top + ActiveSheet.Shapes(i).Height
        If y > maxY Then maxY = y
    Next
    
    If maxY = 0# Then
        maxY = ActiveSheet.Cells.SpecialCells(xlLastCell).Top + _
            ActiveSheet.Cells.SpecialCells(xlLastCell).Height
    End If
    
    GetLastBottom = maxY
End Function