テーブル機能の備忘録 ⑨ 範囲の消去(1) 見た目が同じものを見分ける

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

今日は、テーブルのデータ範囲消去についての紹介。
f:id:Infoment:20110501113140j:plain

データ範囲の消去

テーブルのデータ範囲を消去する方法は、主に二つある。

一括削除

データ範囲を指定して、一括削除する。テーブルの行数に関係なく、一気に削除できるので便利だ。

Sub DeleteSample_1()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    
        Tb.DataBodyRange.Delete
End Sub
一行ずつ削除

繰り返し処理で、一行ずつ削除する。

上から削除する場合、一行削除するたびに、下の行が繰り上がってくる。
例えば一行目を削除すると、二行目が一番上(=一行目)になる。
従って、その後に「二行目」を指定して削除すると、かつて二行目だった一行目が消えずに残ってしまう。

これを回避するためには、常に一行目を消し続ければ良い。

Sub DeleteSample_1()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    
    Dim ListRow As Excel.ListRow
    Dim i As Long
        For i = 1 To Tb.ListRows.Count
            Tb.ListRows(1).Delete
        Next
End Sub

或いは、一番下から上に向かって順に消しても良い(こちらの方が、一般的か)。

Sub DeleteSample_1()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
    
    Dim ListRow As Excel.ListRow
    Dim i As Long
        For i = Tb.ListRows.Count To 1 Step -1
            Tb.ListRows(i).Delete
        Next
End Sub

エラー回避

先に紹介した ↓ この方式には、難点がある。

        Tb.DataBodyRange.Delete

二回続けて実行すると、エラーになるのだ。何もないから、消しようがないのか。ちなみに一行ずつ消す方式なら、エラーにならない(消そうとして直ぐ、ループから抜けるから)。

例えば ↓ のテーブルがあるとする。
f:id:Infoment:20200308112112p:plain

データ範囲を消すと、こうなる。
f:id:Infoment:20200308112155p:plain

この状態は、テーブルが一行しかない状態で、入力されている文字をDeleteキーで消した場合と見分けがつかない。

これを見分けたい場合、ListRowオブジェクトの数を数えればよい。

  • Deleteキーで消した場合 ⇒ 1個
  • DataBodyRange.Deleteの場合 ⇒ 0個

以上を踏まえると、一つ目の例は、最終的にこうなる。

Sub DeleteSample_1()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' ListRowオブジェクトが1つ以上ある場合に限り、
        ' 一括削除する。
        If Tb.ListRows.Count > 0 Then
            Tb.DataBodyRange.Delete
        End If
End Sub

個人的に、テーブルの行数が多い場合は、こちらの方法を使っている。

明日に続きます。

参考まで。