テーブル(ListObject)の最終行を取得するコードを解説します。
と、早速始めたいところですがその前に。
ListObjectには、テーブルを行ごと(データのレコードごと)に扱うためのListRowプロパティという便利なものがあります。
例えばこのテーブル
のすべての行をループして「売上」を計算するときは、
Dim テーブル As ListObject Set テーブル = ActiveSheet.ListObjects(1) Dim R As Long For R = 1 To テーブル.ListRows.Count Dim レコード As Range Set レコード = テーブル.ListRows(R).Range レコード(4) = レコード(2) * レコード(3) Next
というコードで書くことができます。
このコードには「シート上の番地(行番号/列番号)」が登場しません。
For~Next文も「第1行:4 から 最終行:9 まで」ではなく、
「第1レコードから第(レコード数)レコードまで」と書けています。
1行目に行を挿入してテーブルの位置が移動しても、
このコードはまったく変更なしでそのまま動きます。
ということで、「テーブルの最終行番号」というのは、
本来であればそこまで求める場面はありません。
特に、普段は「最終行」の一番の需要である、
For~Next文の終端としてはめったに使わないと思います。
それをしなくていいというのがテーブルの良さですからね。
テーブルの最終行は、なにかのフォーマットに埋め込まれたテーブルの、
フォーマット内の設置場所を調べるようなときに使うことになります。
そのことを念頭に読み進めてください。
さて本題のテーブルの最終行ですが、
一発で取得するプロパティは残念ながらありませんので、
Dim テーブルエリア As Range Set テーブルエリア = ActiveSheet.ListObjects(1).Range Dim LastR As Long LastR = テーブルエリア.Rows.Count + テーブルエリア.Row - 1
と、ListObjectオブジェクト.Rangeで取得したセル範囲の最終行を求めます。
あるセル範囲の最終行は、
- 最終行 = セル範囲全体の行数 + セル範囲の上部の行数
- セル範囲の上部の行数 = セル範囲の第1行 - 1
で求まりますね。
この「セル範囲の行数 + セル範囲の第1行 - 1」という式はよく出てきますので、
Function GetLastRセル範囲(セル範囲 As Range) As Long GetLastRセル範囲 = セル範囲.Rows.Count + セル範囲.Row - 1 End Function
と、セル範囲を渡すと最終行をくれる関数を作っておくと良いです。
この関数があると、テーブルの最終行も
テーブルの最終行 = GetLastRセル範囲(ActiveSheet.ListObjects(1).Range)
これで求まるようになります。
最終行取得は良く扱うコードだけに、関数化のメリットも大きいです。
気が向いたら作ってみてください。