@ Antwort Vityata der bekommt direkt ins Herz des Problems - mit <>
statt =
hier der Chef Problem.
(mit Empfehlung des @ arcadeprecinct von c.Value
statt c.Text
ist auch eine gute Idee.)
Wenn Sie diese in Excel von Hand zu bewältigen waren, würden Sie wahrscheinlich, wenn auch nicht gehen line-by-line - Recht? Sie würden die integrierte Filterung von Excel verwenden ... und mit VBA können Sie die gleichen wunderbaren Ergebnisse in Eile erhalten, indem Sie das Range
Objekt verwenden, das in AutoFilter
Methode gebaut wird.
Option Explicit
Sub DeleteOthersWithAutoFilter()
Dim r1 As Range, c As Range
'Grab the full data range, not just column H
With Sheets("Sheet2")
Set r1 = .Range(.Cells(1, 1), .Cells(Rows.Count, "N").End(xlUp))
End With
With r1
'Apply the Autofilter method to column H in the range
'identifying any cells NOT containing "<<<Keep Row"
.AutoFilter Field:=8, _
Criteria1:="<><<<Keep Row"
'Clear the remaining, visible rows while keeping the headers
Set c = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
c.ClearContents
End With
'Clear the filter
Sheets("Sheet2").AutoFilterMode = False
End Sub
Mit Range.AutoFilter
statt durch einzelne Reihen von looping kann sehr schnell sein, vor allem, wie die Datensätze größer werden.
Sie können mehr über die Unterschiede zwischen den beiden Strategien lernen, durch Reihen und Range.AutoFilter
Looping, hier:
https://danwagner.co/how-to-delete-rows-with-range-autofilter/
, die ein Video jeweils in Aktion Benchmarking YouTube umfasst.
Vityata gab die Antwort, aber ich möchte hinzufügen, dass Sie '.Text' nicht verwenden sollten. '.Text' ist die Zeichenfolge, die tatsächlich auf dem Bildschirm angezeigt wird. Also, wenn Ihre Spalte zu eng wird, wird es "####" und es wird alles löschen. Verwenden Sie stattdessen ".Value". – arcadeprecinct