表の全行に対して処理する為には、データの最終行が分からないと、行の増減に対応できません。
最終行の取得方法を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 が無かったので追加。

コメント