Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zeilen löschen mit VBA

Zeilen löschen mit VBA
03.03.2017 07:49:28
r2d2
Hallo,
ich muß, um eine Datei zu verkleinern, alle Datensätze, die keine Werte bzw. in Summe 0 sind löschen. Hierzu verwende ich folgenden Code:
Sub Makro1()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Range("AJ2").FormulaR1C1 = "=IF(SUM(RC[-30]:RC[-2])=0,""DELETE"","""")"
Range("AJ2").Copy
Range("AJ3:AJ50000").PasteSpecial
Application.CutCopyMode = False
Columns("AJ:AJ").Copy
Columns("AJ:AJ").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False,  _
Transpose:=False
Application.CutCopyMode = False
For i = 50000 To 2 Step -1
If Range("AJ" & i) = "DELETE" Then Rows(i).Delete
Next
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Da es 50.000 Zeilen sind, dauert das ganze recht lange.
Kann man das irgendwie "schneller" machen?
Danke für eure Antworten
Gruß r2d2
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen löschen mit VBA
03.03.2017 09:30:38
UweD
Hallo
Sub Makro1()
    Dim LR As Long
    
    Application.ScreenUpdating = False
    
    With Sheets("Tabelle1")
        LR = .Cells.SpecialCells(xlCellTypeLastCell).Row 'Letzte Zeile des gesamten Blattes 
        With .Range("AJ2:AJ" & LR)
            .FormulaR1C1 = "=IF(SUM(RC[-30]:RC[-2])=0,""DELETE"","""")"
            .Value = .Value
        End With
        
        If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten 
        .Columns(36).AutoFilter Field:=1, Criteria1:="DELETE"
        
        .Rows("2:" & LR).Delete xlUp
        .AutoFilterMode = False

    End With
End Sub

Möge die Macht mit dir sein.
LG UweD
Anzeige
AW: Zeilen löschen mit VBA
03.03.2017 09:38:34
Daniel
Hi
ja, gibt es.
ändere die Formel so ab, dass sie statt dem """" die Zeilennummer ausgibt.
Schreibe außerdem die Formel gleich in alle Zellen, dann musst du sie nicht zusätzlich kopieren:
Range("AJ2:AJ50000").FormulaR1C1 = "=IF(SUM(RC[-30]:RC[-2])=0,""DELETE"",ROW())"
zum löschen hast du dann zwei Möglichkeiten:
a) über die .SpecialCells die Zellen mit Text ("Delete") auswählen und löschen:
Range("AJ2:AJ50000").specialCells(xlcelltypeformulas, 2).entireRow.Delete

hierbei wäre es noch sinnvoll, die Tabelle vor dem Löschen nach Spalte AJ zu sortieren, so dass alle zu löschenden Zeilen einen lückenlos zusammenhängenden Block bilden.
Da ansonsten die Zeilennummer in dieser Spalte steht, wird die Reihenfolge der restlichen Zeilen nicht verändert.
b) die Zeilen mit "Delete" über das Duplikate-Entfernen löschen (in den Zeilen, die stehen bleiben müssen, steht immer ein individueller Wert, daher werden sie nicht gelöscht)
dazu muss noch in die Überschriftenzeile das Delete, in dein Fall reicht es wahrscheinlich aus, die Formel auch in die Überschriftenzeile zu schreiben:
With Range("AJ1:AJ50000")
.FormulaR1C1 = "=IF(SUM(RC[-30]:RC[-2])=0,""DELETE"",ROW())"
.EntrieRow.RemoveDuplicates .Column, Header:=xlno
.ClearContents
End with
Gruß Daniel
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige