[[20190414205157]] 『マクロでTableの最終行を取得する方法について』(マイン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロでTableの最終行を取得する方法について』(マイン)

いつもお世話になっております。

Excelのテーブルスタイルの機能を使用した表から
実際の値がある最終行を求める方法についてアドバイスをお願いします。

表の概要

・テーブルスタイル適用範囲(A1:Z100)
・実際にデータのある最終行(50行目)

これをマクロで最終行を求めると

r = .Cells(.Rows.Count, 1).End(xlUp).Row
r = 100

となります。
実際の値がある最終行は「50行目」なのに何故でしょうか?

仕方なく、現在は以下のコードを2回実行して最終行を求めています。

r = .Cells(.Rows.Count, 1).End(xlUp).Row でテーブルの表自体の最終行求め

r = .Cells(r, 1).End(xlUp).Row 更に上記値から更に実際の最終行を求める

r = 50 すると適正な最終行が求められる。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 A列1番下のセルを選択して、Ctal + ↑キー で、自分で確認しようとは思わないのかね?
(BJ) 2019/04/14(日) 21:39

ここを参考にすると
https://stackoverflow.com/questions/43631926/lastrow-and-excel-table
 Option Explicit

 Sub test()
    Dim r As Long

    r = Cells(1).ListObject.Range.Columns(1).Cells.Find("*", SearchDirection:=xlPrevious).Row
    MsgBox r

 End Sub

(マナ) 2019/04/14(日) 21:46


 >・テーブルスタイル適用範囲(A1:Z100) 
 >・実際にデータのある最終行(50行目) 

 列に関わらす使用されている最終行?

 r = ActiveSheet.ListObjects(1).Range.Find("*", , , , 1, 2).Row
(seiya) 2019/04/14(日) 21:54

BJ さま

アドバイスありがとうございます。

Ctal + ↑ は確認していませんでした。

.Cells(.Rows.Count, 1).End(xlUp).Rowと同じことだと認識していたもので・・・
ご指示どおり試しましたが、やはり同じ結果で、テーブルとして使用されている最終行が認識されます。
BJさまと私のPCの環境の違いなのでしょうか。

マナさま
seiyaさま

ありがとうございます。参考サイトでも同じような質問があり参考になりました。

結果

ListObjects がポイントだったのですね。

アドバイスを頂いた

Cells(1).ListObject.Range.Columns(1).Cells.Find("*", SearchDirection:=xlPrevious).Row

で、適正な数値が得られました。

Sub aaa()
Dim sh1 As Worksheet: Set sh1 = Worksheets("基本")

    Dim r, rr As Long

    r = sh1.Cells(Rows.Count, 3).End(xlUp).Row
    MsgBox r 'テーブルとして使用されている最終行が取得される。

        rr = sh1.Cells(1).ListObject.Range.Columns(1).Cells.Find("*", SearchDirection:=xlPrevious).Row
    MsgBox rr '真にデータのある最終行が取得される。

End Sub

(マイン) 2019/04/15(月) 01:11


訂正です。

ポイントは

「ListObject.Range」によりテーブル内のデータを取得できる。

だから、Ctal + ↑では取得できなかったのですね。
(マイン) 2019/04/15(月) 01:17


 マナさんとseiyaさんの回答ですけど、まぁ殆ど無いとは思いますが、
 前回の検索でコメントなどを検索してたらエラーになります。

 回避するには、LookIn を xlFormulas か xlValues のどちらかを指定します。

 テーブルの配置が決まっていて、初めのご提示のようにA列で検索すると言うのが決まってるなら、
 ListObjectは必要なく、以下でも良いです。

 r = .Range("A:A").Find("*", , xlValues, , , xlPrevious).Row

(sy) 2019/04/15(月) 07:21


 追記

 xlFormulas と xlValues は、どちらを使えば適してるかはセルの内容次第なので、
 正しく検索出来た方を使って下さい。

(sy) 2019/04/15(月) 07:41


sy さま

他パターンを想定してのアドバイスありがとうございます。

アドバイスのコードListObject.Rangeを使用しなくても値のある最終行を求めてくれました。

おかげさまで、無事解決することができました。

皆様、ありがとうございました(^o^)
(マイン) 2019/04/15(月) 14:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.