for文などで1行目から最終行、または1列目から最終列まで連続して処理を行いたいときがあります。
この記事では最終行と最終列を取得するVBAのサンプルコードをご紹介します。
A列に5行目までデータが入力されています。
1行目にF列(6列目)までデータが入力されています。
行が非表示であったり、フィルターやグループ化されていると正確な最終行が取得できません。
正確な最終行を取得するには経理・会計事務所向けエクセルスピードアップ講座さんの
「【落とし穴に注意】VBAで最終行の行番号を取得する」の「4.UsedRangeの結果に補正を加える方法」を
使用したほうが良いです。

【落とし穴に注意】VBAで最終行の行番号を取得する
VBAで最終行の行番号を取得する方法を紹介します。 最終行を取得する方法は様々なブログで紹介されています。 ところが、一般的に紹介されている方法だと、正しく最終行を取得できない場合...
最終列の取得は上記の最終行取得を応用したものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
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行目のデータが入力されている最終列をメッセージボックスで表示します。
コメント