Excel VBAでフィルターをかけた後に行削除を行う方法【エラー1004の解決】

Visual Basic

Excel VBAでフィルターを使用して特定の行を削除する際に「エラー1004」が発生する問題を解決するための手順を解説します。この記事では、コード内での一般的な誤りとその修正方法について説明します。

エラー1004の原因と解決方法

エラー1004は「この操作を実行するとワークシート上のテーブル内でセルが移動されてしまうため、この操作は行われません」と表示され、特にフィルターをかけた後に行削除を試みた際に発生します。これが起こる原因は、フィルターで非表示になった行を削除しようとしたためです。

解決するためには、フィルターで表示された行だけを対象に削除する必要があります。

修正方法:フィルター後に削除する行を選択する

コードの修正方法としては、フィルターで表示されている行のみを削除するようにすることが重要です。以下のコード例を参考にしてください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("B1")) Is Nothing Then
        Cancel = True
        Dim tblA As ListObject
        Set tblA = ActiveSheet.ListObjects("テーブル1")
        With tblA.Range
            .AutoFilter 1, "*【*"
            ' フィルター後の表示行を削除
            On Error Resume Next
            .SpecialCells(xlCellTypeVisible).Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete
            On Error GoTo 0
            .AutoFilter 1
        End With
    End If
End Sub

コードの解説

このコードでは、以下のような処理が行われています。

  • AutoFilter 1, “*【*”: 列1にフィルターをかけて、指定された条件でデータを絞り込みます。
  • .SpecialCells(xlCellTypeVisible): フィルターで表示されているセルのみを対象にします。
  • .EntireRow.Delete: フィルターで表示されている行を削除します。
  • On Error Resume Next: フィルター結果がない場合にエラーをスキップする処理です。

フィルター後の削除を行う際の注意点

フィルター後に削除する際には、非表示の行に対して処理を行わないように注意する必要があります。上記のコードで「SpecialCells(xlCellTypeVisible)」を使用することで、表示されているセルのみを対象に行削除が行われます。

また、「On Error Resume Next」を使用してエラーを無視し、エラーが発生した場合にプログラムが停止しないようにしています。これにより、フィルター条件に一致する行がなくてもエラーが発生せずに処理を続けられます。

まとめ

Excel VBAでフィルター後に行削除を行う際に「エラー1004」が発生する場合、フィルターで表示されている行のみを削除対象にする必要があります。上記のコードを参考にすることで、正しく行削除ができるようになります。

コメント

タイトルとURLをコピーしました