2016-06-29 3 views
0

Ich habe ein Makro, das die Werte auf einem anderen Blatt zusammenfasst, und basierend auf diesen Werten muss es auf dem ersten Blatt zurückgehen und löschen. Aber das Makro löscht, was ich behalten möchte.Programmcode löscht die Daten, die ich behalten möchte

The sheet.

The Macro: 
Sub DeleteOthers() 
    Dim r1 As Range, c As Range 
    Dim t As String 

    With Sheets("Sheet2") 
     Set r1 = .Range(.Cells(2, "H"), .Cells(Rows.Count, "H").End(xlUp)) 
    End With 

    For Each c In r1 
     If c.Text = "<<<Keep Row" Then 
      Sheets("Sheet1").Select 
      t = c.Offset(0, -1) 
      Rows(t).ClearContents 
     End If 
    Next 
End Sub 
+2

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

Antwort

0

Wechseln zu:

If c.Text <> "<<<Keep Row" Then 
0

@ 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.

+0

Hallo, danke, aber so, es ist Löschen auf dem Blatt 2, wenn ich zu Blatt 1 wechseln, wo ich löschen möchte. Ich stelle vor das Set c = und das c.clear, um das Sheet1 zu betrachten, um das Cleanning zu machen, aber es wird nicht funktionieren. – TerrorJapones

Verwandte Themen