表の全行に対して処理する為には、データの最終行が分からないと、行の増減に対応できません。
最終行の取得方法を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の戻り値用の変数名が間違っていたので修正。


コメント