オートフィルターの最終行を取得するコードを解説します。
これを一発で取得するプロパティは残念ながらありませんので、
オートフィルターの設置されたセル範囲全体を取得する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 になる制御付きなので安心ですね。
最終行取得は良く扱うコードだけに、関数化のメリットも大きいです。
気が向いたら、他の最終行でも作ってみてください。