web-dev-qa-db-ja.com

VBA:Excelでフィルター処理された行を削除する方法

いくつかのデータを含むExcelテーブルがあります。次のvbaコードを使用して、いくつかのフィールドの空白セルのみをフィルタリングし、これらの行を削除しようとしています

ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=7, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=8, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=9, Criteria1:= _
        "="
ActiveSheet.UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.rows.Count - 1).rows.Delete
ActiveSheet.ShowAllData

この列に空白のセルがある場合にのみ機能します。しかし、空白セルがないときに問題に直面し、上記のコードを使用すると、すべての範囲がシートから削除されます。この問題を回避する方法は?フィルター条件などを変更する必要がありますか?

17
mbigun

SpecialCellsを使用して、自動フィルタリング後に表示される行のみを削除します。

ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete

範囲内に削除したくないヘッダー行がある場合、範囲にオフセットを追加して除外します。

ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete
40
Jon Crowell

UsedRangeを使用するか、明示的な範囲アドレスを提供する代わりに、AutoFilter.Rangeプロパティは影響を受ける範囲を指定することもできます。

ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp)

ここで使用されているように、オフセットにより、オートフィルター範囲の後の最初の行も削除されます。それを避けるために、.Offset()の後に.Resize()を使用してみます。

13
KeyLimePy