テーブル機能の備忘録 ② テーブルの範囲指定(2)

先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日も、昨日の続きから。

f:id:Infoment:20200225222941j:plain

テーブルでデータを記載する↓「ボディ」部。
f:id:Infoment:20200224230041p:plain

昨日の繰り返しになるが、例えばこのように選択できる。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        
        Tb.DataBodyRange.Select
End Sub

通常のRangeと同様、こちらもループ処理が可能だ。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        
    Dim r As Range
    Dim i As Long: i = 1
        For Each r In Tb.DataBodyRange
            r.Value = i
            i = i + 1
        Next
End Sub

試しに、各セルに「何番目の処理か」を入力してみた。ループの際は、
列方向が優先されるようだ。
f:id:Infoment:20200225223558p:plain

シートがRow(行)がたくさん集まったもの(Application.Rowsプロパティ)であるように、DataBodyRangeもまた、ListRowオブジェクトがたくさん集まったもの(ListRowsコレクション)として扱うことが出来る。

ここで注意が必要なのが、例えばListRows(1)だけでは範囲にならないということ。一行目の範囲を示す場合、ListRowオブジェクトのメンバーであるRangeプロパティまで記載する。
f:id:Infoment:20200225230521p:plain

従って、テーブルのデータ範囲の一行目の最初のセルを指定するなら、こうなる。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        
        ' 以下、3通りを例示。どれでも可。
        Tb.ListRows(1).Range.Range("A1").Select
        Tb.ListRows(1).Range.Cells(1, 1).Select
        ' 一行しかないので、.Cells(1)という表記が可能。
        Tb.ListRows(1).Range.Cells(1).Select
End Sub


次回も、ListRowオブジェクトについてご紹介。
明日に続きます。

参考まで。