テーブル機能の備忘録 ⑨ 範囲の消去(1) 見た目が同じものを見分ける
先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日は、テーブルのデータ範囲消去についての紹介。
データ範囲の消去
テーブルのデータ範囲を消去する方法は、主に二つある。
一括削除
データ範囲を指定して、一括削除する。テーブルの行数に関係なく、一気に削除できるので便利だ。
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
二回続けて実行すると、エラーになるのだ。何もないから、消しようがないのか。ちなみに一行ずつ消す方式なら、エラーにならない(消そうとして直ぐ、ループから抜けるから)。
例えば ↓ のテーブルがあるとする。
データ範囲を消すと、こうなる。
この状態は、テーブルが一行しかない状態で、入力されている文字を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
個人的に、テーブルの行数が多い場合は、こちらの方法を使っている。
明日に続きます。
参考まで。