LoginSignup
2

More than 5 years have passed since last update.

[EXCEL]絞り込み中のテーブルを行削除をしようとしたら実行時エラー1004が出たので対策

Last updated at Posted at 2017-03-10

やりたいこと

テーブルをフィルタして表示されているレコードを削除する。
これをVBAで実行する。

■サンプルのテーブル
1.png

このテーブルを鈴木で絞り込んで行削除したい。

2.png

やったこと

下記コードを実行してみた。※エラー処理は除いてます。

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"になっていた。

手で行削除するときにもこの挙動が見られるのでそういうことなんだろうなと解釈。

↓鈴木の行を複数選択すると削除できない。
4.png

↓佐藤の行をまとめて複数選択すると削除できる。
5.png

対応

行を指定すると失敗するが、セルを選択すると範囲が離れていても削除できるみたい。

↓鈴木のセルだけ選択。
6.png

というこで、セル選択にするため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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2