テーブルにレコードを追加するときの注意点 ② 集計行がある場合

Excelのテーブル機能について、昨日は表のすぐ下にレコードを追加すると、表が自動的に拡張されることを確認した。
infoment.hatenablog.com
しかしこの方法は、例えば「集計行」がある場合は役に立たない。今日は、これについて確認する。
f:id:Infoment:20190407210943p:plain

Excelにおいて、テーブルとして書式設定された表は、
・ListObject
というオブジェクトになる。このオブジェクトへのレコード追加には、Addメソッドを用いる。

Sub TableTest()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        Tb.ListRows.Add
End Sub

このとおり最終レコードである「みかん」と集計行の間に、一行追加されている。
f:id:Infoment:20190407212223g:plain

私も先日、社内の勉強会で教わった口なのだが、この追加したListRowsは変数で受け取ることが出来る。こんな感じだ。

Sub TableTest()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    Dim AddedRow As ListRow
    Set AddedRow = Tb.ListRows.Add
End Sub

f:id:Infoment:20190407221417p:plain

従って、これに昨日の配列を充て込むことで、集計行があってもレコードの追加が可能となる。
ちなみに、これだとエラーになる。

Sub TableTest()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    Dim AddedRow As ListRow
    Set AddedRow = Tb.ListRows.Add
        AddedRow = Array("ばなな", 300, "フィリピン")
End Sub

f:id:Infoment:20190407221335p:plain

なぜなら、ListRowオブジェクトはリストの行そのものであって、行の範囲を表しているわけではないから。この場合、

AddedRow.Range

のように、追加した行の範囲としなければならない。

以上を踏まえると、次のようになる。

Sub TableTest()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    Dim AddedRow As ListRow
    Set AddedRow = Tb.ListRows.Add
        AddedRow.Range = Array("ばなな", 300, "フィリピン")
End Sub

f:id:Infoment:20190407221949g:plain

昨日のように、テーブルの善意(?)に甘えるよりは少しマシになっただろうか。
もう少しだけ続きます。

参考まで。