最終行(Row)取得(空白まで)

表の全行に対して処理する為には、データの最終行が分からないと、行の増減に対応できません。
最終行の取得方法を2パターン紹介します。

空白行までの件数となります。
もう一つは、下から検索し、空白があっても最終行を取得する方法です。
例としては、ファイルを開いて、そのファイルの最終行を取得します。

以下の関数を使用しているため、リンクを参照してください。
ファイルの有無を確認する (IsFileExists)

last_row = GetBlankRow(ws) は、6が last_row に格納される。
last_row = GetBlankRow(ws, 4) は、1が last_row に格納される。

【サンプルプログラム】

Sub sample1()
	Dim wb As Workbook
	Dim ws As Worksheet
	Dim filename As String
	Dim last_row As Long

	filename = "C:\ExcelVBA\最終行列取得\sample1.xlsx"

	if IsFileExists(filename) = True Then	' ファイルの有無を確認
		Set wb = Workbooks.Open(filename)	' ブックを開く
		Set ws = wb.Sheets(1)			' シートを取得

		last_row = GetBlankRow(ws)	' 最終行を取得

		' ブックを閉じる
		wb.Close
		MsgBox "最終行は" & last_row & vbCrLf, vbInformation
	Else
		MsgBox filename & "は存在しません", vbExclamation
	End If
End Sub

【関数化】

空白までの最終行を取得します。開始地点を行数、列数の数字で指定します。
Cell と同じで、A1は 1,1 で、D1は、1,4 になります。省略するとA1が開始地点となります。

' ------------------------------------------------------------
' 説明:最終行を取得(空白まで)
' 引数:1:処理対象のワークシート 省略時はActiveSheet
'       2:基準となる 行数 を指定
'       3:基準となる 列数 を指定
' 戻値:空白までの最終行数
' ------------------------------------------------------------
Function GetBlankRow(Optional ByVal ws As Worksheet = Nothing, Optional row As Long = "1", Optional col As Long = "1") As Long
    If ws Is Nothing Then
        Set ws = ActiveSheet
    End If

    If ws.Cells(row, col) = "" Then
        ' 指定行目が空白の場合は、1行とする(エラーと判別する)
        GetBlankRow = 0
    ElseIf ws.Cells(row + 1, col) = "" Then
        ' 次の行目が空白の場合は、指定行とする
        GetBlankRow = row
    Else
        ' セルの 1行目 から最終行を取得
        GetBlankRow = ws.Cells(row, col).End(xlDown).row
    End If
End Function

空白までの最終行を取得します。開始地点をRangeで指定します。
”A1” や “D1” を指定します。省略するとA1が開始地点となります。

' ------------------------------------------------------------
' 説明:最終行を取得(空白まで)
' 引数:1:処理対象のワークシート 省略時はActiveSheet
'       2:基準となる Range を指定
' 戻値:空白までの最終行数
' ------------------------------------------------------------
Function GetBlankRowFromRange(Optional ByVal ws As Worksheet = Nothing, Optional base As String = "A1") As Long
    If ws Is Nothing Then
        Set ws = ActiveSheet
    End If

    If ws.Range(base) = "" Then
        ' 指定行目が空白の場合は、0行とする(エラーと判別する)
        GetBlankRowFromRange = 0
    ElseIf ws.Range(base).Offset(1, 0) = "" Then
        ' 次の行目が空白の場合は、指定行とする
        GetBlankRowFromRange = ws.Range(base).row
    Else
        ' セルの 1行目 から最終行を取得
        GetBlankRowFromRange = ws.Range(base).End(xlDown).row
    End If
End Function

【修正】
2024/06/22 Worksheetの引数をByValに変更。
2024/08/19 行数と列数を指定できるように修正。Rangeを指定する場合は、「GetBlankRowFromRange」に関数名変更。
2024/09/14 GetBlankRowFromRangeの戻り値用の変数名が間違っていたので修正。

コメント