テーブルのデータを消すときの注意点(失敗談)

テーブルのデータを消そうとして、失敗した時のお話。
f:id:Infoment:20191218223625p:plain

先日から登場している、このテーブルを例に説明する。
f:id:Infoment:20191218223748p:plain

このデータを綺麗に消したい時、一番手っ取り早いのは、例えばこんなやり方だ。

Sub test()
    ActiveSheet.ListObjects(1).DataBodyRange.Delete
End Sub

アクティブシートの、ListObject(=テーブル)の塊(なので複数形のsが付き)の一つ目の(つまり(1))、データが入った範囲(=DataBodyRange)を削除(Delete)する。
※今回は、たまたま一つ目のテーブルだったので、ListObjects(1)となっている。
※二つ目のテーブルだったら、ListObjects(2)となる。

このとおり、きれいに消える。
f:id:Infoment:20191218224107p:plain

では何が失敗なのか。
この状態でもう一度同コードを実行すると、エラーになるのだ。
f:id:Infoment:20191218224204p:plain

何が悪くて怒られているのか、最初は良く判らなかった。
どうやら、データが無い状態でDataBodyRangeを消そうとしたのがNGらしい。

一方、一度でも↓このように何か入力して、
f:id:Infoment:20191218224347p:plain

Deleteキーで入力情報を削除した場合はどうか。
f:id:Infoment:20191218224448p:plain

この場合は、エラーにならない。見た目は同じなだけに、厄介だ。

結局あれこれと弄ってみて、これに落ち着いた。

Sub test()
    Dim Tb As ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        If Tb.ListRows.Count > 0 Then
            Tb.DataBodyRange.Delete
        End If
End Sub

ListRowsコレクションの数を数えて、1つでもあればDataBodyRangeを削除する方式だ。先のように一度でも何か入力した時点でレコードが作成され、Deleteキーで内容を消したとしても、レコードを消したことにはならないらしい。

他にも良い方法があるかも知れないけれど、当面はこれで乗り切るとします。

参考まで。