2017-04-17 5 views
3

Ich habe eine Subroutine, die Zeilen in einem Bereich mit etwa 1000 Zeilen löscht. Zeilen werden in einem Kriterium gelöscht. Der folgende Code funktioniert.Excel VBA löscht Zeilen in einer for-Schleife Zeilen fehlt

Wenn ich jedoch das Makro ausführen, muss ich es normalerweise 4 Mal ausführen, bevor alle Zeilen mit den Entfernungskriterien entfernt werden.

Ich denke, das liegt daran, dass die for-Schleife ihren Index verfehlt, wenn eine Zeile beim Löschen einer Zeile plötzlich verschwindet.

Mein erster Code sieht so aus.

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

     For Each StatusCell In StatusRange 
        If StatusCell = "FG" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "QC" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "CS" Then 
         StatusCell.EntireRow.Delete 
        Else 
       End If 
    Next StatusCell 

Wenn ich versuche, den Bereich jede Schleife zu aktualisieren, es immer noch nicht funktioniert.

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
    For Each StatusCell In StatusRange 
      If StatusCell = "FG" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "QC" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "CS" Then 
       StatusCell.EntireRow.Delete 
      Else 
     End If 

     Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
     Next StatusCell 

Gibt es jemanden, der eine Sloution kennt? Vielen Dank.

+1

Arbeit von teh unten nach oben. Wenn Sie eine Zeile löschen, wird alles und yuou diese Zeile überspringen auf Die nächste Iteration – Jeeped

+1

Dies ist mit ziemlicher Sicherheit eine doppelte Frage, und ich werde sie als solche kennzeichnen, wenn ich das passende Duplikat finde.Wenn Sie Elemente aus einer Sammlung löschen, müssen Sie * von 'Rows.Count zu 1 Step -1 löschen 'sonst überspringen Sie Zeilen –

+0

Gehen Sie weiter und duplex @DavidZemens - Ich habe etwas Wert hinzugefügt, indem Sie die Case-Anweisung für mehrere Vergleiche zeigen, aber das ist immer noch ein Betrogener. – Jeeped

Antwort

6

Arbeiten Sie von unten nach oben. Wenn Sie eine Zeile löschen, wird alles nach oben verschoben und Sie überspringen diese Zeile bei der nächsten Iteration.

Hier ist der "Mut" des Codes von unten nach oben arbeiten.

With Worksheets("Sheet1") 
    For rw = .Cells(.Rows.Count, "B").End(xlUp).Row To 2 Step -1 
     Select Case UCase(.Cells(rw, "B").Value2) 
      Case "FG", "QC", "CS" 
       .Rows(rw).EntireRow.Delete 
     End Select 
    Next rw 
End With 
+0

Ich schrieb wörtlich die gleiche Antwort (komplett mit 'Case' Statement) haha: D –

+0

Verdammt, ich war gerade fertig mit dem Schreiben und Posten fast genau den gleichen Code;) –

1

Da es keine Umkehrschleife ist für For Each Sie einen etwas anderen Ansatz verwenden müssen.

Auch der Code mit mehreren If s und OR ist „für den Einsatz von Select Case schreien.

Dim StatusRange As Range 
Dim i As Long 

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

' loop backward when deleting Ranges, Rows, Cells 
For i = StatusRange.Rows.Count To 1 Step -1 
    Select Case StatusRange(i, 1).Value 
     Case "FG", "QC", "CS" 
      StatusRange(i, 1).EntireRow.Delete 
     Case Else ' for the future if you need it 

    End Select 
Next i 
Verwandte Themen