2017-03-14 5 views
1

Kann das Folgende geändert werden, um Folgendes zu tun: Löschen einer Zeile basierend auf einem Spaltennamen und Zellenwert? oder mehrere Spaltennamen und Zellen? Das Beispiel ist: Ich möchte alles löschen, das den Wert 'Complete' in der Spalte 'Status' hat, aber ich möchte auch 'Complete' in der Spalte 'Second Status' löschen, aber die Zeile nicht löschen, wenn ' completed "ist in der Spalte" ColumnA "und über mehrere Blätter auch ... Ich weiß, dass dies viel verlangt ..Excel-Vba-Makro zum Löschen von Zeilen oder Spalten basierend auf Zellenwert und Spaltenname

Hoffe, dass macht Sinn, und ty im Voraus!

Sub TestDeleteRows() 
Dim rFind As Range 
Dim rDelete As Range 
Dim strSearch As String 
Dim sFirstAddress As String 
Dim sh As Worksheet 

strSearch = "Completed" 
Set rDelete = Nothing 

Application.ScreenUpdating = False 
For Each sh In ThisWorkbook.Sheets 
With sh.Columns("A:AO") 
Set rFind = .Find(strSearch, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext, MatchCase:=False) 
If Not rFind Is Nothing Then 
    sFirstAddress = rFind.Address 
    Do 
     If rDelete Is Nothing Then 
      Set rDelete = rFind 
     Else 
      Set rDelete = Application.Union(rDelete, rFind) 
     End If 
     Set rFind = .FindNext(rFind) 
    Loop While Not rFind Is Nothing And rFind.Address <> sFirstAddress 

    rDelete.EntireRow.Delete 
    Set rDelete = Nothing 
End If 
End With 
Next sh 
Application.ScreenUpdating = False 
End Sub 

Antwort

0

Die .AutoFilter-Methode bietet schnelle Teilmengen von Daten zum Kopieren oder Löschen.

Option Explicit 

Sub Macro1() 
    Dim vCOLs As Variant 

    With ActiveSheet 
     If .AutoFilterMode Then .AutoFilterMode = False 
     vCOLs = Array(Application.Match("Status", .Rows(1), 0), _ 
         Application.Match("Second Status", .Rows(1), 0), _ 
         1) 
     With .Cells(1, 1).CurrentRegion 
      'do not delete rows with 'Completed' in first column 
      .AutoFilter field:=vCOLs(2), Criteria1:="<>Completed" 
      'delete rows with 'Complete' in Status column 
      .AutoFilter field:=vCOLs(0), Criteria1:="Complete" 
      With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0) 
       If CBool(Application.Subtotal(103, .Cells)) Then 
        .Cells.EntireRow.Delete 
       End If 
      End With 
      .AutoFilter field:=vCOLs(0) 
      'delete rows with 'Complete' in Second Status column 
      .AutoFilter field:=vCOLs(1), Criteria1:="Complete" 
      With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0) 
       If CBool(Application.Subtotal(103, .Cells)) Then 
        .Cells.EntireRow.Delete 
       End If 
      End With 
     End With 
     If .AutoFilterMode Then .AutoFilterMode = False 
    End With 
End Sub 
+0

Hallo, ich versuchte dies und es Fehler auf der unten Zeile aus, weil „Auto Filtermethode des zulässigen Bereichs-Klasse ist fehlgeschlagen“ .AutoFilter Feld: = vCOLs (1), Criteria1: = „Completed“ –

+0

Das ist wahrscheinlich, weil Ich musste raten, wie deine Daten aussehen. Ändern Sie einfach .CurrentRegion, um Ihren Datenblock genau wiederzugeben. – Jeeped

+0

von "Ihrem Datenblock" meinst du einen Bereich ähnlich wie A: G zum Beispiel? –

Verwandte Themen