0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Excel VBA] 最下行の行番号を取得する (フィルタ解除不要版)

Last updated at Posted at 2024-08-22

ざっくり説明

データが入力されている最下行の行番号を返してくれます。

列を指定することもできますし、
シート全体の中での最下行を求めることもできます。
→ 差別化ポイント①
フィルタ解除なしに最下行を求めることができます。
→ 差別化ポイント②

コード

最下行の行番号を取得する(フィルタ解除不要版)
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秒

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?