いくつかのデータを含む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
この列に空白のセルがある場合にのみ機能します。しかし、空白セルがないときに問題に直面し、上記のコードを使用すると、すべての範囲がシートから削除されます。この問題を回避する方法は?フィルター条件などを変更する必要がありますか?
SpecialCellsを使用して、自動フィルタリング後に表示される行のみを削除します。
ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
(xlCellTypeVisible).EntireRow.Delete
範囲内に削除したくないヘッダー行がある場合、範囲にオフセットを追加して除外します。
ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _
(xlCellTypeVisible).EntireRow.Delete
UsedRangeを使用するか、明示的な範囲アドレスを提供する代わりに、AutoFilter.Rangeプロパティは影響を受ける範囲を指定することもできます。
ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp)
ここで使用されているように、オフセットにより、オートフィルター範囲の後の最初の行も削除されます。それを避けるために、.Offset()の後に.Resize()を使用してみます。