最終行の取得方法というと
Range("A" & Rows.Count).End(xlUp).Row
のようなコードを使用するが、オートフィルタ適用時には思ったような答えを返さない。
このような表があるとする。
オートフィルタ設定前に確認すると最終行は11である。
オートフィルタを設定する 。
見た目上の最終行は9である。
この状態で上記のコードを実行すると返ってくる答えは
9が返ってくる。
困る。
最終行取得コード
そんな時は例えばこのようなコードで最終行を取得できる。
Worksheets(1).AutoFilter.Range(Worksheets(1).AutoFilter.Range.Count).Row
AutoFilter.Range
AutoFilterのRangeプロパティはAutoFilterの対象となるセル範囲のオブジェクトを返します。
今回の例で言えばA1:B11のセル範囲オブジェクトを返しています。
このRangeプロパティはオートフィルタがかかっている状態でも正しくAutoFilterの対象となっているセル範囲を返してくれる。
Range プロパティ (Excel) | Microsoft Docs
Range.Count
RangeのCountプロパティはRangeオブジェクトに含まれるセルの個数を返します。
今回の例で言えば22を返しています。
Range プロパティ (Excel) | Microsoft Docs
CountプロパティはLong型なので対象セルの個数が2,147,483,647を超える場合は
Countlargeプロパティを使用する。
Range(.item)([Rowindex],[ColumnIndex])
RangeのItemプロパティはRangeオブジェクト内の相対的な位置のRangeオブジェクトを返します。
今回の例で言えばRange("A1:B11").item(22) となります。
ItemプロパティはRangeオブジェクトのデフォルトプロパティで、省略しても機能します。
が隠れているということは頭の片隅に置いておいたほうが良いでしょう。
Itemプロパティは2つの引数を持っていて両方を指定した場合、Rowindexは縦方向の相対的な位置を表しますが、Rowindexのみを指定した場合はセル範囲のインデックスを表します。
このようなイメージです。
オートフィルタの対象となっているA1:B11のセル範囲のうち22番めのセル
すなわちB11セルを返しています。
最後にB11セルの行番号をRowプロパティで取得することで正しい最終行を取得しています。