やりたいこと
テーブルをフィルタして表示されているレコードを削除する。
これをVBAで実行する。
このテーブルを鈴木で絞り込んで行削除したい。
やったこと
下記コードを実行してみた。※エラー処理は除いてます。
sample
Sub sample()
Dim tb As ListObject
Set tb = ListObjects("テーブル1")
tb.Range.AutoFilter Field:=2, Criteria1:="鈴木"
tb.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub
そうしたところ、Delete時に1004実行時エラーが発生することがあった。
発生する条件を調べたところ、鈴木で絞り込んで実行するとエラーが出て、佐藤で絞り込んで実行するとエラーが出ないことが分かったのでそこから原因を探った。
原因(たぶん)
削除する範囲が離れているとエラーが出るっぽい。
tb.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow
のAddressを見てみると鈴木の場合は"$2:$2,$4:$4,$7:$7"
になっていた。
佐藤の場合は"$5:$6"
になっていた。
手で行削除するときにもこの挙動が見られるのでそういうことなんだろうなと解釈。
対応
行を指定すると失敗するが、セルを選択すると範囲が離れていても削除できるみたい。
というこで、セル選択にするためEntireRowを除外。
また「行全体を削除しますか」というダイアログがでるので表示されないように前後でApplication.DisplayAlertsを変更させる。
これで落ち着いた。
sample
Sub sample()
Dim tb As ListObject
Set tb = ListObjects("テーブル1")
tb.Range.AutoFilter Field:=2, Criteria1:="鈴木"
Application.DisplayAlerts = False
tb.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
End Sub