Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

オートフィルタ適用状態の最終行の取得方法

最終行の取得方法というと

Range("A" & Rows.Count).End(xlUp).Row

のようなコードを使用するが、オートフィルタ適用時には思ったような答えを返さない。

このような表があるとする。
f:id:ExcelLover:20200216184657j:plain

オートフィルタ設定前に確認すると最終行は11である。

オートフィルタを設定する 。
f:id:ExcelLover:20200216184804j:plain

見た目上の最終行はである。

この状態で上記のコードを実行すると返ってくる答えは

が返ってくる。

困る。


最終行取得コード

そんな時は例えばこのようなコードで最終行を取得できる。

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のみを指定した場合はセル範囲のインデックスを表します。

このようなイメージです。
f:id:ExcelLover:20200216184842j:plain

オートフィルタの対象となっているA1:B11のセル範囲のうち22番めのセル

すなわちB11セルを返しています。

最後にB11セルの行番号をRowプロパティで取得することで正しい最終行を取得しています。