こんにちは!Lenocoです。本日も見てくださりありがとうございます。
今回は最終行取得についてのTips回です!!!
指定シートの指定列内で最終行を返すマクロ
最終行の取り方
VBAの最終行の取り方、上からと下から、2種類あるのはご存知でしょうか。
イメージとしては、Excelのキーボード操作の「Ctrl + ↓」が上から、「Ctrl + ↑」が下から、という感じです。
上からとる場合、間に空白セルがないことが条件となります。
空白セルがある行のデータで「Ctrl + ↓」を押した時、空白セルの手前のセルで止まってしまいますよね。
そのため、空白セルがある可能性がある場合は下からとったほうが確実です。
下から最終行をとることが良くあるのですが、
項目によっては最終行までデータが入っていないことがある表の場合、
各列の最終行を比べて一番大きい最終行を返したいことがあります。
シート、開始列、終了列を渡すとその間で一番大きい最終行を返してくれるマクロを作成したので是非参考にしてみてください!
コード
Function GetLastRow(sh As Worksheet, startCol As Long, lastCol As Long) As Long
Dim i As Long
Dim lastRow As Long
For i = startCol To lastCol
If lastRow < sh.Cells(Rows.Count, i).End(xlUp).Row Then
lastRow = sh.Cells(Rows.Count, i).End(xlUp).Row
End If
Next i
GetLastRow = lastRow
End Function
コードの説明
値を返すので、SubではなくFunctionで作成しています。
戻り値は最終行(Long型)を返します。
引数には、最終行を知りたいシートと、列範囲の最初と最後の列番号を渡しています。
ループ用の変数、最終行を格納する変数を作成します。
Forの初期値はstartColを設定し、最終値にlastColを設定します。
Forの中では、lastRowの中身と、各列の最終行番号を比較し、
lastRowの方が小さかったら新しい最終行番号でlastRowを上書きします。
それを指定した最終列まで繰り返します。
Forを抜けたとき、lastRowには指定範囲列の一番大きい最終行番号が格納されている、ということになります。
最後はFunction名に値を代入して終了です。
なお、これはFunctionなので単体では使用できません。
使用する場合は以下のように他のプロシージャから呼び出す必要があります!
Sub Main()
Dim row As Long
row = GetLastRow(ActiveSheet,1,10)
End Sub
さいごに
決まった列範囲の最終行を取りたいことが度々あるため、このようなマクロを作ってみました。
シートや列範囲を引数で変えられるため、汎用性があるかなと思います。
是非使ってみてください!
Lenoco