2016-07-27 3 views
0

Ich habe versucht, einige Zeilen zu löschen, deren sechste Zelle nicht den richtigen Wert enthält. Und hier ist mein Code:VBA So löschen Sie die falschen diskreten Zeilen

dim i As Integer 
for i = 1 to Row 
    If Worksheets("Data").Cells(i,6).Text <>"a" Then 
     Worksheets("Data").Rows(i).Delete 
    End If 
Next i 

Und ich habe festgestellt, dass, wenn ich Linie 1 (aaa) löschen, dann die ehemalige Linie 2 (bbb) wird Linie 1, vielleicht ist es nicht die Linie, die ich will halten , aber ich bin schon 2 geworden, also habe ich eigentlich diese linie (bbb) verpasst und direkt auf die ehemalige linie 3 (ccc) entfernt.

1 aaa => bbb 
2 bbb => ccc 
3 ccc 

Und ich weiß nicht, ob es einen guten Algorithmus für dieses Problem gibt? Vielen Dank.

+1

warum nicht nur eine einfache Lösung hat Hier, wenn du in dein 'If' gehst, dann, nachdem du die Zeile gelöscht hast, füge einfach eine Zeile' i = i - 1' hinzu. –

+0

Oh, also beginne ich immer von der vorherigen Zeile, wo ich eine gelöscht habe? – Hiddenllyy

+0

Wenn Sie eine Zeile löschen, dann ja. Sie wollen keine Zeile überspringen. –

Antwort

2

Wenn Sie Zeilen löschen, ist es am besten, von unten nach oben zu arbeiten.
Ändern Sie for i = 1 to Row zu for i = Row to 1 Step -1.

Wenn Sie jetzt eine Zeile löschen, wird die Zeilennummer der darüber liegenden Zeilen nicht geändert.

2

Wir machen es in umgekehrter Reihenfolge. Versuchen Sie, den untenstehenden Code wie gewünscht zu ändern.

Sub Deleterows() 
    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row ' calculates no of rows used in A column 

    For iCntr = lRow To 6 Step -1 ' loop in reverse order 
     If Cells(iCntr, 1) = "str" Then 'You can change this text 
      Sheets("Data").Rows(iCntr).Delete 
     End If 
    Next 

    End Sub 
+0

Tut mir leid, ich habe nicht ruhig verstanden, 'LRow' ist die Anzahl der Zeilen, die ich in diesem Blatt habe? dann gehe ich von der letzten Zeile 'LRow' nach 6, oder? – Hiddenllyy

+0

Richtig! .Irow ist die Anzahl der Zeilen in der A-Spalte –

+0

Ok ich sehe! Vielen Dank, aber ich muss einen als Antwort wählen und Mr. Darren kommt zuerst, also ... Nun, deine Antwort ist perfekt! – Hiddenllyy

3

Beim Löschen immer vom letzten zum ersten iterieren.

dim i As Integer 
for i = Row to 1 Step -1 
    If Worksheets("Data").Cells(i,6).Text <>"a" Then 
     Worksheets("Data").Rows(i).Delete 
    End If 
Next i 
1

Ich würde vorschlagen, dass Sie die while-Schleife verwenden, so dass Sie die Iterationen sowie die Grenze der Schleife reduzieren könnten eine Zeile nach dem Löschen, siehe unten

Dim i As Integer 
Dim rows As Integer 
row_count = 3 
i = 1 

While i <= row_count 
    If Worksheets("Data").Cells(i, 6).Text <> "a" Then 
     Worksheets("Data").rows(i).Delete 
     i = i - 1 
     row_count = row_count - 1 
    End If 
    i = i + 1 
Wend 
Verwandte Themen