和風スパゲティのレシピ

日本語でコーディングするExcelVBA

オートフィルターの最終行を取得する

オートフィルターの最終行を取得するコードを解説します。


これを一発で取得するプロパティは残念ながらありませんので、
オートフィルターの設置されたセル範囲全体を取得するAutoFilter.Rangeを使い、
そのエリアの最終行を取得する
手法を用います。

Dim フィルターエリア As Range
Set フィルターエリア = ActiveSheet.AutoFilter.Range

Dim LastR As Long
LastR = フィルターエリア.Rows.Count + フィルターエリア.Row - 1
  • 最終行 = フィルターエリア全体の行数 + フィルターエリアの上部の行数
  • フィルターエリアの上部の行数 = フィルターエリアの第1行 - 1

で求めています。


この「セル範囲の行数 + セル範囲の第1行 - 1」という式はよく出てきますので、

Function GetLastRセル範囲(セル範囲 As Range) As Long
    GetLastRセル範囲 = セル範囲.Rows.Count + セル範囲.Row - 1
End Function

と、セル範囲を渡すと最終行をくれる関数を作っておくと良いです。


この関数があると、フィルターエリアの最終行も

オートフィルターの最終行 = GetLastRセル範囲(ActiveSheet.AutoFilter.Range)

これで求まるようになります。


オートフィルターを良く扱う人は、さらに細かくフィルター専用の関数にして、

Function GetLastRフィルター(ws As Worksheet) As Long
    Dim フィルターエリア As Range
    Set フィルターエリア = ActiveSheet.AutoFilter.Range
    If フィルターエリア.Rows.Count > 1 Then
        GetLastRフィルター = フィルターエリア.Rows.Count + フィルターエリア.Row - 1
    End If
End Function

Function Get1stRフィルター(ws As Worksheet) As Long
    If ActiveSheet.AutoFilter.Range.Rows.Count > 1 Then
        Get1stRフィルター = ActiveSheet.AutoFilter.Range.Row + 1
    End If
End Function

こうしておくのもいいかもしれません。


これがあると、例えばオートフィルター内の全行を走査するFor文を、

Dim R As Long
For R = Get1stRフィルター(ActiveSheet) To GetLastRフィルター(ActiveSheet)

これで書けるようになるため、メインコード前の準備にかかる時間を減らせます。


見出しのみのデータに遭遇した時は、
For R = 0 To 0 になる制御付きなので安心ですね。


最終行取得は良く扱うコードだけに、関数化のメリットも大きいです。
気が向いたら、他の最終行でも作ってみてください。

www.limecode.jp