for文などで1行目から最終行、または1列目から最終列まで連続して処理を行いたいときがあります。 この記事では最終行と最終列を取得するVBAのサンプルコードをご紹介します。
A列に5行目までデータが入力されています。
1行目にF列(6列目)までデータが入力されています。
行が非表示であったり、フィルターやグループ化されていると正確な最終行が取得できません。 正確な最終行を取得するには下記のリンク先の方法を使用したほうが良いです。
【落とし穴に注意】VBAで最終行の行番号を取得する
最終列の取得は上記の最終行取得を応用したものになります。
Option Explicit
Function GetMaxRow(sht As Worksheet, check_col As Long) As Long
'###################################################################################
'指定した列のデータが入力されている最終行を取得する。
'行が非表示、フィルター、グループ化されていてもデータが入力されている最終行を取得できる
'参照元URL:https://www.excelspeedup.com/vbalastrow/
'-----------------------------------------------------------------------------------
'引数 :sht シートオブジェクト[Worksheet]
' :check_col 最終行を検索したい列番号[Long]
'戻り値:sht内のcheck_col列の最終行
'###################################################################################
Dim lastRow As Long
lastRow = sht.UsedRange.Row + sht.UsedRange.Rows.Count - 1
GetMaxRow = 0
Dim readRow As Long
For readRow = lastRow To 1 Step -1
If sht.Cells(readRow, check_col).Value <> "" Then
GetMaxRow = readRow
Exit For
End If
Next
End Function
Function GetMaxCol(sht As Worksheet, check_row As Long) As Long
'###################################################################################
'指定した行のデータが入力されている最終列を取得する。
'列が非表示、フィルター、グループ化されていてもデータが入力されている最終列を取得できる
'-----------------------------------------------------------------------------------
'引数 :sht シートオブジェクト[Worksheet]
' :check_row 最終列を検索したい行番号[Long]
'戻り値:sht内のcheck_row行の最終列
'###################################################################################
Dim lastCol As Long
lastCol = sht.UsedRange.Column + sht.UsedRange.Columns.Count - 1
GetMaxCol = 0
Dim readCol As Long
For readCol = lastCol To 1 Step -1
If sht.Cells(check_row, readCol).Value <> "" Then
GetMaxCol = readCol
Exit For
End If
Next
End Function
Sub TestGetMaxRowCol()
'最終行を取得したいシートを宣言します
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets("Sheet1")
'シート内の1列目(A列)にデータが入力されている最終行をメッセージボックスで表示します
MsgBox GetMaxRow(sht, 1)
'シート内の1行目のデータが入力されている最終列をメッセージボックスで表示します
MsgBox GetMaxCol(sht, 1)
End Sub
GetMaxRowとGetMaxColの動作確認をしてみます。
TestGetMaxRowColを実行するとGetMaxRowとGetMaxColをそれぞれ呼び出して、テストを行います。
最初にGetMaxRowのテストを行います。
シート内の1列目(A列)のデータが入力されている最終行をメッセージボックスで表示します。
続いてGetMaxColのテストを行います。
シート内の1行目のデータが入力されている最終列をメッセージボックスで表示します。