【VBA】最終行と最終列を取得する

概要

for文などで1行目から最終行、または1列目から最終列まで連続して処理を行いたいときがあります。
この記事では最終行と最終列を取得するVBAのサンプルコードをご紹介します。

A列に5行目までデータが入力されています。
1行目にF列(6列目)までデータが入力されています。

行が非表示であったり、フィルターやグループ化されていると正確な最終行が取得できません。
正確な最終行を取得するには経理・会計事務所向けエクセルスピードアップ講座さん
「【落とし穴に注意】VBAで最終行の行番号を取得する」の「4.UsedRangeの結果に補正を加える方法」を
使用したほうが良いです。

最終列の取得は上記の最終行取得を応用したものになります。

 1Option Explicit
 2
 3Function GetMaxRow(sht As Worksheet, check_col As Long) As Long
 4'###################################################################################
 5'指定した列のデータが入力されている最終行を取得する。
 6'行が非表示、フィルター、グループ化されていてもデータが入力されている最終行を取得できる
 7'参照元URL:https://www.excelspeedup.com/vbalastrow/
 8'-----------------------------------------------------------------------------------
 9'引数  :sht       シートオブジェクト[Worksheet]
10'      :check_col  最終行を検索したい列番号[Long]
11'戻り値:sht内のcheck_col列の最終行
12'###################################################################################
13
14  Dim lastRow As Long
15  lastRow = sht.UsedRange.Row + sht.UsedRange.Rows.Count - 1
16  GetMaxRow = 0
17    
18  Dim readRow As Long
19  For readRow = lastRow To 1 Step -1
20    If sht.Cells(readRow, check_col).Value <> "" Then
21      GetMaxRow = readRow
22      Exit For
23    End If
24  Next
25
26End Function
27
28Function GetMaxCol(sht As Worksheet, check_row As Long) As Long
29'###################################################################################
30'指定した行のデータが入力されている最終列を取得する。
31'列が非表示、フィルター、グループ化されていてもデータが入力されている最終列を取得できる
32'-----------------------------------------------------------------------------------
33'引数  :sht       シートオブジェクト[Worksheet]
34'      :check_row  最終列を検索したい行番号[Long]
35'戻り値:sht内のcheck_row行の最終列
36'###################################################################################
37
38  Dim lastCol As Long
39  lastCol = sht.UsedRange.Column + sht.UsedRange.Columns.Count - 1
40  GetMaxCol = 0
41    
42  Dim readCol As Long
43  For readCol = lastCol To 1 Step -1
44    If sht.Cells(check_row, readCol).Value <> "" Then
45      GetMaxCol = readCol
46      Exit For
47    End If
48  Next
49  
50End Function
51
52Sub TestGetMaxRowCol()
53  
54  '最終行を取得したいシートを宣言します
55  Dim sht As Worksheet
56  Set sht = ThisWorkbook.Worksheets("Sheet1")
57  
58  'シート内の1列目(A列)にデータが入力されている最終行をメッセージボックスで表示します
59  MsgBox GetMaxRow(sht, 1)
60  
61  
62  'シート内の1行目のデータが入力されている最終列をメッセージボックスで表示します
63  MsgBox GetMaxCol(sht, 1)
64
65End Sub

GetMaxRowとGetMaxColの動作確認をしてみます。
TestGetMaxRowColを実行するとGetMaxRowとGetMaxColをそれぞれ呼び出して、テストを行います。

最初にGetMaxRowのテストを行います。
シート内の1列目(A列)のデータが入力されている最終行をメッセージボックスで表示します。

続いてGetMaxColのテストを行います。
シート内の1行目のデータが入力されている最終列をメッセージボックスで表示します。

関連ページ