ざっくり説明
データが入力されている最下行の行番号を返してくれます。
列を指定することもできますし、
シート全体の中での最下行を求めることもできます。
→ ここ差別化ポイント!
コード
最下行の行番号を取得する
Function GetLastRowNumber(ByVal WS As Worksheet, Optional ByVal colNumber As Long = 0) As Long
'================================
'用途 :最下行 行番号の取得
'--------------------------------
'第一引数:Worksheetオブジェクト (Worksheet型)
'第二引数:対象列番号 (Long型)
'戻り値 :最下行 行番号 (Long型)
'特記事項:第ニ引数の省略でWS全体の最下行を返す
'================================
Dim lastRowNumber As Long
If colNumber <> 0 Then
lastRowNumber = WS.Cells(WS.Rows.Count, colNumber).End(xlUp).Row
If WS.Cells(1, colNumber) = "" Then
lastRowNumber = 0
End If
Else
lastRowNumber = Range("A1").SpecialCells(xlLastCell).Row
End If
GetLastRowNumber = lastRowNumber
End Function
使用方法
第一引数にWorksheetオブジェクトを指定し、
第二引数(任意)に列番号を渡します。
第二引数が入力されている場合は その列番号での最下行の行番号を返し、
第二引数が未入力(もしくは0)の場合は そのシート内での最下行の行番号を返します。
仕様等
-
1行目から最下行の間に空白セルがあっても最下行の行番号を求められます
-
第二引数で何も入力されていない列の列番号を指定した場合、
最下行の行番号は 0 が返ってきます!
後者ですが、"既に入力されているセルの1つ下のセルに新たに内容を追加する"
という運用を想定しているためこのような仕様になっています。
仕様が不要な方は
If WS.Cells(1, colNumber) = "" Then
lastRowNumber = 0
End If
を消してください。
何も入力されていない列の列番号を指定した場合は 1 が返ってくるようになります。
注意点
- 非表示行がある場合 正常に動作しない可能性があります
- フィルタが設定されている場合 正常に動作しない可能性があります
フィルタの解除には以下記事のClearFilter()
が使えます。
関数内で呼び出してもいいですし、
サブルーチンの関数を使う直前で使ってもいいです。
その他
フィルタをかけたまま最下行を求められる方法もあるけどそれはまた追々…
2024/8/23追記
フィルタかけたまま最下行を求められる関数を書きました