最終行(Row)取得(一番下から)

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

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

条件としては、タイトル行が存在していることになります。
列数を取得して、各列の最大数を取得します。

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

last_row = GetLastRow(ws) は、4が last_row に格納される。
last_row = GetLastRow(ws, 4) は、5が last_row に格納される。
last_row = GetLastRows(ws) は、6が last_row に格納される。

【サンプルプログラム】

Option Explicit

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

	' サンプルファイル
	filename = "C:\ExcelVBA\最終行列取得\sample2.xlsx"

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

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

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

【関数化】

' ------------------------------------------------------------
' 説明:最終行を取得(下から)
' 引数:1:処理対象のワークシート 省略時はActiveSheet
'       2:基準となる 列数 を指定 (A=1,B=1…Z=26,AA=27…) 省略時は1 
' 戻値:Excelの一番下のセルから、空白ではないところまでの最終行数
' 補足:Excelの一番下のセルから、End + ↑ を操作したときと同じ
' ------------------------------------------------------------
Function GetLastRow(Optional ByVal ws As Worksheet = Nothing, Optional column As Long = 1) As Long
    If ws Is Nothing Then
        Set ws = ActiveSheet
    End If
    
    GetLastRow = ws.Cells(Rows.Count, column).End(xlUp).row
End Function
' ------------------------------------------------------------
' 説明:最終行を取得(下から)
' 引数:1:処理対象のワークシート 省略時はActiveSheet
'       2:基準となる 列番号名を指定 省略時は"A"
' 戻値:Excelの一番下のセルから、空白ではないところまでの最終行数
' 補足:Excelの一番下のセルから、End + ↑ を操作したときと同じ
' ------------------------------------------------------------
Function GetLastRowStr(Optional ByVal ws As Worksheet = Nothing, Optional column As String = "A") As Long
    If ws Is Nothing Then
        Set ws = ActiveSheet
    End If
    
    GetLastRowStr = ws.Range(column & Rows.Count).End(xlUp).row
End Function

【関数化】

タイトル列を検索して、その中で最大の行数を取得します。

' ------------------------------------------------------------
' 説明:先頭行の最終列までの最終行(右から)の最大数を取得(下から)
' 引数:1:処理対象のワークシート 省略時はActiveSheet
'       2:開始する 列数を指定 (A=1,B=1…Z=26,AA=27…) 省略時は1
' 戻値:Excelの一番下のセルから、空白ではないところまでの最終行数
' 補足:Excelの一番下のセルから、End + ↑ を操作したときと同じ
'       先頭列は、Excelの一番右のセルから、End + ← を操作したときと同じ
' ------------------------------------------------------------
Function GetLastRows(Optional ByVal ws As Worksheet = Nothing, Optional row As Long = 1) As Long
	Dim column As Long
	Dim idx1 As Long
	Dim maxrow As Long
	Dim wkrow As Long
	Dim fullrow As Long

	If ws Is Nothing Then
		Set ws = ActiveSheet
	End If

	' タイトル行の列数を取得する
	If ws.Cells(row, 2) = "" Then
		column = 1
	Else
		column = ws.Cells(row, 1).End(xlToRight).column
	End If

	' Excelの最終行を取得
	fullrow = ws.Cells(Rows.Count, 1).row

	' 全ての列で最終行を取得し最大の値を最終行とする。
	maxrow = 0
	For idx1 = 1 To column
		wkrow = ws.Cells(fullrow, idx1).End(xlUp).row      ' 最終行を取得
		If maxrow < wkrow Then
			maxrow = wkrow
		End If
	Next idx1

	GetLastRow = maxrow
End Function

【修正】
2024/06/22 Worksheetの引数を省略可能に変更しByValに変更。複数列から検索する方法をGetLastRowsに変更し、指定列検索のGetLastRow、GetLastRowStrを追加。
2024/09/16 ActiveSheet をセットする際、Set が無かったので追加。

コメント