Excelのテーブル(ListObject)は、データが日々追加・削除されることが多く、最終行を正しく取得することが非常に重要です。
特に「次の行に新しいデータを追加する」「最終行のデータを読み取る」といった処理では、テーブルの行数が固定されていないため、動的に最終行を取得する必要があります。
ここでは、VBAでテーブルの最終行を取得する方法と、それを応用した処理について解説します。
目次
1. テーブルの最終行を取得する基本構文
テーブルの行は ListRows.Count で数えることができます。
つまり「最終行の番号」=「行数」となります。
サンプルコード(最終行の番号を取得)
Sub テーブル最終行取得()
Dim ws As Worksheet
Dim lo As ListObject
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'テーブルの最終行番号を取得
lastRow = lo.ListRows.Count
MsgBox "テーブルの最終行は " & lastRow & " 行目です"
End Sub
2. 最終行の範囲(Range)を取得する方法
単に行数ではなく「最終行のセル範囲」を直接取得することもできます。
サンプルコード(最終行の範囲を取得)
Sub テーブル最終行範囲取得()
Dim ws As Worksheet
Dim lo As ListObject
Dim lastRowRange As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'最終行の範囲を取得
If lo.ListRows.Count > 0 Then
Set lastRowRange = lo.ListRows(lo.ListRows.Count).Range
lastRowRange.Select
Else
MsgBox "テーブルにデータがありません"
End If
End Sub
ポイント
lo.ListRows(lo.ListRows.Count)
→ 最終行の ListRow オブジェクトを取得.Range
をつけると、その行全体のセル範囲が取得できる
3. 応用例① 最終行にデータを追加する
「最後の行の次にデータを入れる」のではなく、「最終行そのものに値を書き込む」ことも可能です。
Sub テーブル最終行に値入力()
Dim ws As Worksheet
Dim lo As ListObject
Dim lastRow As ListRow
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
If lo.ListRows.Count > 0 Then
'最終行のListRowを取得
Set lastRow = lo.ListRows(lo.ListRows.Count)
'値を入力
With lastRow.Range
.Cells(1, 1).Value = "最終商品" '1列目
.Cells(1, 2).Value = 999 '2列目
.Cells(1, 3).Value = Date '3列目
End With
End If
End Sub
4. 応用例② 最終行を削除する
最終行を削除する場合も簡単です。
Sub テーブル最終行削除()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
If lo.ListRows.Count > 0 Then
lo.ListRows(lo.ListRows.Count).Delete
End If
End Sub
5. 応用例③ 新しいデータ追加処理に応用
最終行を取得してから 次の行にデータを追加する形で、ログ管理や売上データの蓄積などに応用できます。
Sub テーブル最終行応用_追加()
Dim ws As Worksheet
Dim lo As ListObject
Dim newRow As ListRow
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'新しい行を追加(最終行の次に挿入される)
Set newRow = lo.ListRows.Add
'新しい行にデータを入力
With newRow.Range
.Cells(1, 1).Value = "商品Z"
.Cells(1, 2).Value = 500
.Cells(1, 3).Value = Date
End With
End Sub
6. まとめ
- 最終行番号は
ListRows.Count
で取得できる - 最終行の範囲は
ListRows(ListRows.Count).Range
で取得できる - 応用すると「最終行への入力」「最終行削除」「次の行に追加」など、柔軟な動的処理が可能
コメント