Excel VBA - Schleife löscht Zeile nicht obwohl die Bedingung wahr sit

Excelmania

Lieutenant
Registriert
Apr. 2010
Beiträge
799
Hallo.

ich importiere in ein Tabellenblatt Daten. Die Importierten Daten umfassen auch Leer-Tupel sowie sich wiederholenden Überschriften.

Diese möchte ich entfernen. Diese habe ich mit einer For next Schleife in VBA und einer Prüfspalte mit Formel realisiert. Es klappt jedoch nicht vollständig. Leere Zeilen bleiben immer stehen.

Code:
Private Sub CMD_Dez_aktualisieren_Click()

   Dim b As Long, v As Long, Zeile As Long
      
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    
        v = Worksheets("Optionen").Range("B142").Value
    
        'letzte Zeile ermitteln
        b = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
        
        'b definieren
        If b < v Then
        b = v
        Exit Sub
        Else
        b = b
        End If
        
        'Formel einfügen
        ActiveSheet.Range("i4").FormulaLocal = "=WENN(UND(LÄNGE(B4);ISTZAHL(B4*1));""OK"";""LÖSCHEN"")"
        
        'Formel ziehen
        ActiveSheet.Range("i4").Select
        Selection.AutoFill Destination:=ActiveSheet.Range("i" & v & ":i" & b), Type:=xlFillValue
        
        Zeile = v
                                        
        'Alle Nicht Personendaten löschen
        With ActiveSheet
            For Zeile = v To b
                If .Range("i" & Zeile) <> "OK" Then
                        Rows(Zeile).Delete
                End If
            Next
        End With
        
        'Prüfspalte löschen
        'Columns("i").Delete
                            
        'letzte Zeile ermitteln
        b = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
                
        'letzte Zeile in Optionen schreiben
        Worksheets("Optionen").Range("c142").Value = b
        
        'Formel einfügen
        ActiveSheet.Range("H4").FormulaLocal = "=WENN(B4="""";"""";ZÄHLENWENN(INDIREKT(Optionen!$D$30);B4))"
        
        'Formel ziehen
        ActiveSheet.Range("H" & v).Select
        On Error Resume Next
        Selection.AutoFill Destination:=ActiveSheet.Range("H" & v & ":H" & b), Type:=xlFillValue
        
    With Application
      .ScreenUpdating = True
      .EnableEvents = True
      .Calculation = xlCalculationAutomatic
    End With

End Sub
 
Es sieht so aus als ob du von oben nach unten gehst...damit überspringt dein Makro Zeilen nach dem löschen.

Versuch mal: For Zeile = b To v step -1
 
Hi,
vielleicht hilft dir das weiter, es ist sehr gut erklärt

und dann per ....Delete Shift:=xlUp

Nachtrag:
Code:
            For Zeile = v To b
                If .Range("i" & Zeile) <> "OK" Then
                        Rows(Zeile).Delete
                End If
            Next

hier ein kleiner Tipp
Code:
Sub Zeilen_Loeschen()
Dim i As Integer
For i = 100 To 8 Step -1
    If Cells(i, 1) = "Wahr" Then
      Rows(i & ":" & i).Delete Shift:=xlUp
Next i
End Sub
 
Zuletzt bearbeitet:
Mit folgenden Code klappt es besser, aber er muss mehrmals ausgeführt werden, bis alle Leerzeilen auch weg sind:

Code:
        'Formel durch Wert ersetzen
        ActiveSheet.Range("i" & v & ":i" & b).Copy
        ActiveSheet.Range("i" & v & ":i" & b).PasteSpecial Paste:=xlValues
                                        
        'Alle Nicht Personendaten löschen
        With ActiveSheet
            For Zeile = v To b
                If .Range("i" & Zeile) = "Löschen" Then
                        Rows(Zeile).Delete
                End If
            Next Zeile
        End With
 
dein Problem ist bestimmt, dass du im durchlauf (for x to y) direkt löscht.
bspw zeile 13 und 14 sind leer. er prüft zeile 13, löscht sie. damit rutschen alle anderen eins nach. deine ehemalige zeile 14 wird die neue zeile 13. deine schleife prüft nun die neue zeuile 14 (ehemals 15). damit wurde die alte 14 nicht geprüft.

du musst also prüfen, ob nach dem löschen wieder eine leere zeile vorliegt. wenn ja, deine variable um 1 reduzieren und weiter machen lassen. oder so in der art :) dann musst du es nicht mehrmals durchlaufen lassen.

alternativ (so würd ich es bestimmt lösen), alle zeilen durchgehen und ein array mit "löschen/nichtlöschen" befüllen. nachdem du dann weißt, welche Zeilen alles gelöscht werden sollen, würd ich sie rückwärts löschen lassen. dann hast du das problem mit dem verschieben/verrutschen während des For-Loops nicht.
 
konnte es lösen.

Code:
        'Alle Nicht Personendaten löschen
        For i = Cells(Rows.Count, 9).End(xlUp).Row To 2 Step -1
          On Error Resume Next
         If InStr(Cells(i, 9).Value, "Löschen") Then
          Rows(i).Delete
        End If
        Next


vielen Dank.
 
  • Gefällt mir
Reaktionen: spcqike
Das ist aber eine arg haarige For-Konstruktion…

While…Wend, Do…Loop sind für solche ›unscharfen‹ Schleifen gedacht, For-Schleifen sind echte Zählschleifen aus denen man allenfalls mit Exit For abspringt. Aber die Kontroll-Größen sollte man grundsätzlich in Ruhe lassen und nicht live ändern.
(Und On Error macht es noch viel schlimmer…)

CN8
 
  • Gefällt mir
Reaktionen: Janush
Zurück
Oben