2017-08-31 3 views
1

Löschen Ich dachte, ich dieses Problem mit Hilfe der Antworten hier gelöst hatte, aber ich bin immer noch nur jede zweite Zeile löschen, die das Löschen benötigt. Die Schleife ist:Für in Excel-VBA-Schleife jede zweite Zeile

For Each row In ActiveSheet.UsedRange.Rows 
    'test for v in cell f and delete if there isn't one 
    str = Cells(row.row, "F").Value 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") <> 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     row.Delete Shift:=xlUp 
    End If 
Next row 

Aber wenn ich es auf den folgenden Zeilen aus:

M 1301 
M 1302 
M 1401 
ES 1501 
M 1501 
M 1502 
MV 1502 
M 1503 
MV 1503 

ich am Ende mit:

M1301 PMH 
M1401 Rod Washer 
M1502 Rod Washer 
MV1502 Rod Washer 
MV1503 Rod Washer 

Ich fühle mich wie ich verrückt werde. Ich hatte auch einen inkrementierenden Zähler in der Schleife und dachte, dass das das Problem war, aber ich habe es immer noch, obwohl ich aufgehört habe, den Zähler zu verwenden, um Zeilen zu referenzieren.

Jede Hilfe in dem Hinweis auf, was ich davon ausgehen, liegt auf der Hand würde geschätzt viel.

Dank

+0

Tyr Feedback zu geben und/oder Kredit diese Zeit für Menschen, die Sie unten unterstützt. Du hast es in früheren Posts, die du hier gefragt hast, nicht getan und hast gute Antworten erhalten. Wissen Sie, wie Sie eine Antwort als "ANTWORT" markieren? –

+0

Entschuldigung - ich werde jetzt herausfinden, wie das geht! – Madeline

Antwort

2

den Code unten Versuchen habe ich versucht, so viel von Ihrer ursprünglichen Logik zu verwenden (obwohl es einfacher und kürzer Möglichkeiten, es zu tun).

Erklärung in dem Code als Kommentare,

Hinweis: im Allgemeinen, Allways Schleife rückwärts beim Löschen Objects oder Rows in Ihrem Fall.

-Code

Option Explicit 

Sub DeleteV() 

Dim Rng As Range, i As Long, LastRow As Long 
Dim Str As String 

' I would rather use Worksheets("SheetName") instead 
Set Rng = ActiveSheet.UsedRange 

LastRow = Rng.Rows.Count + Rng.Row - 1 ' just in case your range starts from the 2nd row (or 3rd...) 

' allways loop backwards when deleting rows 
For i = LastRow To Rng.Row Step -1 
    'test for v in cell f and delete if there isn't one 
    Str = Cells(i, "F").Value 
    Debug.Print "str is " & Str 

    If InStr(1, Str, "V") <> 0 Then 
     Debug.Print "hello str is " & Str 
    Else 
     Rows(i).Delete 
    End If 
Next i 


End Sub 
+0

Danke. Ich vermutete, dass es wahrscheinlich bessere Möglichkeiten gibt, und jetzt macht das Beispiel, das rückwärts geht, viel mehr Sinn für mich. Kann ich fragen, warum Sie Arbeitsblätter ("SheetName") anstelle von ActiveSheet verwenden? – Madeline

3

Da Sie eine Reihe row.Delete Shift:=xlUp beispielsweise Zeile 4, Zeile 5 jetzt 4 wird Zeile löschen, wenn Sie die Zeile gelöscht und Sie dann in der nächsten Zeile (Zeile 5, die die alte Zeile 6) gehen.

können Sie entweder setzen Row = Row - 1 nach dem löschen oder man könnte es eine andere Art und Weise tun, die rückwärts zu gehen.

Beispiel

For X = range("A" & rows.count).end(xlup).row to 2 step - 1 
    'Do something per row 
    'Delete a row if need be 
Next 

Dies sollten Sie genug von einer Idee geben, dies zu beheben.

+0

Schöne detaillierte Erklärung –

+0

Danke. Was ist der Zweck von xlup in Klammern nach dem Ende? – Madeline

+0

@Madeline Es steht für Pfeil nach oben. – AntiDrondert

1

Ich kann einige Änderungen im Code vorschlagen, die helfen:

'always store reference to the sheet in a variable! 
Dim sh As Worksheet 
Set sh = ActiveSheet 
'determine last row in F column 
lastRow = sh.Cells(sh.Rows.Count, 6).End(xlUp).Row 

For i = lastRow To 1 Step -1 
    'test for v in cell f and delete if there isn't one 
    'we make it uppercase, to avoid situation that we didn't match v with V 
    str = UCase(sh.Cells(i, 6).Value) 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") > 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     Rows(i).Delete 
    End If 
Next i 
+0

Sie möchten beim Löschen von Zeilen eine Schleife vorwärts machen? –

+0

Danke für Bemerkung :) –

+0

Danke - was ist der Grund dafür, den Verweis auf das Blatt immer in einer Variablen zu speichern? – Madeline

1

Sobald Sie eine Zeile löschen, werden alle folgenden Zeile Indizes verringern, indem ein.

Das bedeutet, wenn Sie Zeile löschen n, weil es ein „V“ enthält, Reihe n+1 jetzt n Zeile und wird nicht geprüft werden.

Daher ist diese, Ihr Code überspringt jede zweite Zeile.

Um es zu beheben, versuchen Sie rückwärts durch die Reihen gehen.

Verwandte Themen