ざっくり説明
データが入力されている最下行の行番号を返してくれます。
列を指定することもできますし、
シート全体の中での最下行を求めることもできます。
→ 差別化ポイント①
フィルタ解除なしに最下行を求めることができます。
→ 差別化ポイント②
コード
Function GetLastRowNumber(ByVal WS As Worksheet, Optional ByVal colNumber As Long = 0) As Long
'================================
'用途 :最下行 行番号の取得
'--------------------------------
'第一引数:Worksheetオブジェクト (Worksheet型)
'第二引数:対象列番号 (Long型)
'戻り値 :最下行 行番号 (Long型)
'特記事項:第ニ引数の省略でWS全体の最下行を返す
'================================
Dim usedrangeArr As Variant
usedrangeArr = WS.UsedRange
Dim tentativeLastRowNumber As Long
Dim tentativeLastColumnNumber As Long
tentativeLastRowNumber = WS.UsedRange.Row + WS.UsedRange.Rows.Count - 1
tentativeLastColumnNumber = WS.UsedRange.Column + WS.UsedRange.Columns.Count - 1
Dim lastRowNumber As Long: lastRowNumber = 0
If colNumber <> 0 Then
lastRowNumber = GetSpecificLastRowNumber(WS, colNumber, tentativeLastRowNumber)
Else
Dim tmpLastRowNumber As Long
Dim i As Long
For i = 1 To tentativeLastColumnNumber
tmpLastRowNumber = GetSpecificLastRowNumber(WS, i, tentativeLastRowNumber)
If tmpLastRowNumber > lastRowNumber Then
lastRowNumber = tmpLastRowNumber
End If
Next
End If
GetLastRowNumber = lastRowNumber
End Function
Function GetSpecificLastRowNumber(ByVal WS As Worksheet, ByVal colNumber As Long, ByVal tentativeLastRowNumber As Long) As Long
Dim rowValues_arr As Variant
rowValues_arr = WS.Columns(colNumber)
Dim lastRowNumber As Long
Dim i As Long
For i = tentativeLastRowNumber To 1 Step -1
If Not IsEmpty(rowValues_arr(i, 1)) Then
lastRowNumber = i
Exit For
End If
Next
GetSpecificLastRowNumber = lastRowNumber
End Function
使用方法
1つ目のGetLastRowNumber関数の、
第一引数にWorksheetオブジェクトを指定し、
第二引数(任意)に列番号を渡します。
第二引数が入力されている場合は その列番号での最下行の行番号を返し、
第二引数が未入力(もしくは0)の場合は そのシート内での最下行の行番号を返します。
※2つのFunctionがセットです。が、ユーザが直接使うのはGetLastRowNumber()
のみです。
仕様等
-
1行目から最下行の間に空白セルがあっても最下行の行番号を求められます
-
第二引数で何も入力されていない列の列番号を指定した場合、
最下行の行番号は 0 が返ってきます!
後者ですが、"既に入力されているセルの1つ下のセルに新たに内容を追加する"
という運用を想定しているためこのような仕様になっています。
注意点
引数なしでの処理はUsedRangeの範囲を走査してるからそれなりに重いカモ🦆
検証は別途記事書こうかな
その他
フィルタ解除してもいいなら下記のマクロのほうがオススメ
2024/8/23追記
検証しようかなって言いましたが
フィルタ解除必要な方の処理が早すぎて比較とかできませんでした
フィルタ解除必要版:300列2000行での最下行取得10セット 0.01秒以下
フィルタ解除不要版:300列2000行での最下行取得10セット 0.08秒