和風スパゲティのレシピ

日本語でコーディングするExcelVBA

テーブル(ListObject)の最終行を取得する

テーブル(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)

これで求まるようになります。


最終行取得は良く扱うコードだけに、関数化のメリットも大きいです。
気が向いたら作ってみてください。

www.limecode.jp