2016-10-14 5 views
2

Ich versuche, ein Blatt mit einem Import einer .CSV-Datei zu aktualisieren. Ich kann alle Informationen lesen und aktualisieren. Nach dem Update möchte ich einige Daten entfernen. Alle Zeilen mit D leer müssen gelöscht werden (ganze Zeile).Zeilen in einer Foreach löschen

Dafür habe ich eine foreach, die überprüft D3: D486 (ist letzte Zeile). Nach dem Ausführen des Makros sind einige Zeilen gelöscht, aber nicht alle Zeilen.

Dim rCell As Range 
    Dim rRng As Range 
    Debug.Print CStr(LastRow) 

    Set rRng = Worksheets("sheet1").Range("D3:D" + CStr(LastRow)) 

    For Each rCell In rRng.Cells 
     If Not IsEmpty(rCell) Then 
      Debug.Print rCell.Row 
     Else 
      Debug.Print "Empty" 
      Worksheets("sheet1").Rows(rCell.Row).Delete 
     End If 
    Next rCell 

Ich denke, es gibt ein Problem mit der for-each .. Von Beispiel, wenn er Reihe 100, das nächste Mal, wenn er geht löscht 101 zu rudern .. Aber das ist vorherige Reihe 102 .. ich sparen kann die Zellen könnten in einem Array sein, aber dann wäre es dasselbe. Außer wenn ich den anderen Weg gehe (von unten nach oben). Wie kann ich das lösen?

Antwort

7

Ich glaube, Sie Ihre eigene Frage beantwortet haben: von unten nach oben ...

und Sie können auch range.EntireRow.Delete Methode versuchen, wie etwas unter

Dim rCell As Range 
Dim lastRow, i 
lastRow = 1000 
For i = lastRow To 1 Step -1 
    ' if condition met 
    Worksheets("Sheet1").Range("D:" + i).EntireRow.Delete 
Next 
+1

Ich würde '&' anstelle von '+', oder wahrscheinlicher 'Arbeitsblätter (" Sheet1 "). Zellen (i, 4) .EntireRow.Delete" - keine Notwendigkeit, Textfolgen und Bereichsadressen dann zu manipulieren. –

2

ich tun würde, es wie folgt:

Dim i As Integer 
Dim rRng As Range 
Debug.Print CStr(LastRow) 

Set rRng = Worksheets("sheet1").Range("D3:D" + CStr(LastRow)) 

For i = 1 To rRng.Cells.Count 
    If Not IsEmpty(Worksheets("Sheet1").Range("D:" + i).Value) Then 
     Debug.Print rCell.Row 
    Else 
     Debug.Print "Empty" 
     Worksheets("Sheet1").Range("D:" + i).EntireRow.Delete 
     i = i - 1 
    End If 
Next 
1

Rex Antwort ist richtig, wenn Sie Sie auch es auf diese Weise tun können, niedlich erhalten möchten:

Sub DeleteRowsWithCriteria() 
Dim rng As Range, rngCell As Range, rngDelete As Range 
Set rng = Worksheets("sheet1").UsedRange.Columns("D:D").Cells 'Watch out here, if columns A-C are not all used, this doesn't work 
For Each rngCell In rng 
    If rngCell.Value = "" Then 
     If rngDelete Is Nothing Then 
      Set rngDelete = rngCell 
     Else 
      Set rngDelete = Union(rngDelete, rngCell) 
     End If 
    End If 
Next rngCell 
rngDelete.EntireRow.Delete xlShiftUp 
End Sub