it-swarm.com.de

VBA: Wie lösche ich gefilterte Zeilen in Excel?

Ich habe eine Excel-Tabelle, die einige Daten enthält. Mit dem nächsten VBA-Code versuche ich, nur leere Zellen in einigen Feldern zu filtern und diese Zeilen zu löschen

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

Es funktioniert nur, wenn ich leere Zellen in diesen Spalten habe. Aber ich hatte ein Problem, wenn ich keine leeren Zellen habe und durch die Verwendung des obigen Codes meinen gesamten Bereich vom Blatt entferne. Wie vermeide ich dieses Problem? Soll ich den Filterzustand ändern oder etwas anderes?

17
mbigun

Verwenden Sie SpecialCells, um nur die Zeilen zu löschen, die nach dem automatischen Filtern sichtbar sind:

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

Wenn sich in Ihrem Bereich eine Kopfzeile befindet, die Sie nicht löschen möchten, fügen Sie dem Bereich einen Versatz hinzu, um ihn auszuschließen:

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

Alternativ zur Verwendung von UsedRange oder zur Angabe einer expliziten Bereichsadresse kann mit der AutoFilter.Range-Eigenschaft auch der betroffene Bereich angegeben werden.

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

Wie hier verwendet, bewirkt Offset, dass die erste Zeile nach dem AutoFilter-Bereich ebenfalls gelöscht wird. Um dies zu vermeiden, würde ich versuchen, .Resize () nach .Offset () zu verwenden.

13
KeyLimePy