Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1848to1852
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro, Rows(i).Delete -- schneller?

Makro, Rows(i).Delete -- schneller?
22.09.2021 10:04:15
Fred
Hallo Excel Profis,
ich möchte in meiner Tabelle die Zeilen löschen, welche in der 99sten Spalte ein "X" beinhalten,- dass sind i.d.R. ca. 4.000 von 5.500
Ich nutze am Laptop das Makro:

Application.ScreenUpdating = False
letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
For i = letzteZeile To 2 Step -1
If (Cells(i, 99)) = "X" Then
Rows(i).Delete
End If
Next i
Application.ScreenUpdating = True
Meine Frage:
Für das Löschen von über 4000 Zeilen werden über 3 Minuten gebraucht. Geht das mit einem anderen Code evt. schneller?
Gruss
Fred

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:16:22
Fennek
Hallo,
ja, im Menü "Daten" ist "Duplikate entfernen" wesentlich schneller.
Mit einer Formel schreibst Du in alle Zeilen, die gelöscht werden sollen, eine "0", sonst die Zeilennummer. In Zeile 1 (header) ebenfalls eine "0".
mfg
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:20:45
Werner
Hallo,
siehe Vorschlag von Fennek, oder mit dem Autofilter Spalte 99 nach X filtern und das Filterergebnis löschen (Makrorekorder).
Oder die entsprechenden Zellen "sammeln" und erst am Schluß alle auf einen Rutsch löschen.

Dim loLetzte As Long, i As Long, raWeg As Range
Application.ScreenUpdating = False
letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
For i = letzteZeile To 2 Step -1
If (Cells(i, 99)) = "X" Then
If raWeg Is Nothing Then
Set raWeg = Cells(i, 99)
Else
Set raWeg = Union(raWeg, Cells(i, 99))
End If
End If
Next i
If Not raWeg Is Nothing Then
raWeg.EntireRow.Delete
End If
Set raWeg = Nothing
Gruß Werner
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:37:48
Daniel
HI
ob AutoFilter oder Union wirklich schneller sind, ist nicht sicher.
die Geschwindigkeit hängt hier vom Aufbau der Daten ab.
der WorstCase ist, dass jedes X einzeln steht. bespielsweise, wenn jede zweite Zeile gelöscht werden soll
x-x-x-x-x-x-x-x-x-x
dann ist Union oder Autofilter nicht schneller als die Schleife, es kann ab einer bestimmten Datenmenge sogar zum Absturz führen.
stehen die X jedoch in großer Anzahl lückenlos direkt untereinander, dann ist das sehr schnell (ggf sogar schneller als Duplikate entfernen)
dh optimal wäre hier so eine Folge:
----xxxxxxxx-----
Will man so arbeiten, würde sich ein vorheriges SORTIEREN sehr positiv auf die Performance auswirken (und im Sortieren ist Excel sehr schnell)
Allerdings besteht ja die Angabe, dass c.a. 4000 von 5000 Zeilen gelöscht werden sollen, dh eine gewisse Blockbildung der zu löschenden Zeilen ist gegeben.
Hintergund des ganzen ist, dass Excel beim Löschen von Zeilen eine Reihe von Aufgaben im Hintergrund erledigen muss.
Bilden die zu löschenden Zeilen einen lückenlosen Block, kann Excel diese Aufgaben für den ganzen Block in einem Schritt durchführen,
Stehen die Zeilen einzeln, müssen diese Aufgaben für jede Zeile einzeln durchgeführt werden.
Dh für die Gewschwindigkeit beim Löschen ist nicht entscheidend, wieviele Zeilen auf einmal gelöscht werden sollen, sondern wieviele lückenlose Blöcke vorhanden sind.
Gruß Daniel
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:21:48
Daniel
HI
was steht denn in den anderen Zellen, also diejenigen, die nicht gelöscht werden sollen?
steht das "x" als Festwert in der Zelle oder wird es per Formel erzeugt?
der Weg von Fennek ist schnell und für viele Fälle einsetzbar, wenn bestimmte Bedingungen gegeben sind, gehts u.U. einfacher.
Gruß Daniel
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:22:37
Oberschlumpf
Hi Fred,
oder eine andere VBA-Idee:

Sub sbTest()
Dim larloRowX() As Long, lloRow As Long, liIdx As Integer
ReDim larloRowX(0)
Application.ScreenUpdating = False
For lloRow = 1 To Cells(Rows.Count, 99).End(xlUp).Row
If Cells(lloRow, 99).Value = "x" Then
larloRowX(UBound(larloRowX)) = lloRow
ReDim Preserve larloRowX(UBound(larloRowX) + 1)
End If
Next
ReDim Preserve larloRowX(UBound(larloRowX) - 1)
For liIdx = UBound(larloRowX) To 1 Step -1
Rows(larloRowX(liIdx)).Delete
Next
Application.ScreenUpdating = True
End Sub
Zuerst wird nur Spalte 99 nach "x"-Einträge durchsucht - wenn vorhanden, merkt sich der Code die Treffer-Zeile(n) in einer Array-Variablen; deren Inhalte werden im RAM "gespeichert".
Danach wird, auch wieder mit For/Next die Array-Var abgearbeitet - ab hier läuft der Code wesentlich schneller.
Ob aber insgesamt alles = schneller als dein Code weiß ich nicht, da ich mangels einer Bsp-Datei von dir nicht testen konnte.
Hilfts denn?
Ciao
Thorsten
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:35:19
UweD
Noch ne Lösung

Sub X_raus()
Dim TB As Worksheet, Sp As Integer, Krit As String, LR As Long
Set TB = Sheets("Tabelle1")
Sp = 99
Krit = "X"
With TB
If .AutoFilterMode Then .AutoFilterMode = False
LR = .Cells(.Rows.Count, Sp).End(xlUp).Row 'letzte Zeile der Spalte
If WorksheetFunction.CountIf(.Columns(Sp), Krit) Then ' Vorab prüfen
.Columns(Sp).AutoFilter Field:=1, Criteria1:=Krit
.Rows(2).Resize(LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete 'gefilterte Zeilen löschen
Else
MsgBox "Keine '" & Krit & "' vorhanden"
End If
.AutoFilterMode = False
End With
End Sub
LG UweD
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:44:32
Daniel
Wie ich schon schrieb, wie man das am besten macht, hängt davon ab was vorliegt
steht das "x" als Festwert in den Zellen und die Zellen, die nicht gelöscht werden sollen sind echte Leerzellen, würde dieser Einzeile ausreichen:

Columns(99).SpecialCells(xlcelltypeconstants, 2).EntireRow.Delete
nochmal beschleunigen lässt sich das durch vorheriges Sortieren (warum, siehe mein anderer Beitrag:

With ActiveSheet.Usedrange
.Sort Key:=.Cells(1, 99), order1:=xlascending,header:=xlno
.Columns(99).SpecialCells(xlcelltypeconstants, 2).EntireRow.Delete
End with
Gruß Daniel
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:50:17
Oberschlumpf
Hi Daniel,
angenommen, von den vielen Ideen hier ist die Idee mit zuerst sortieren, dann der Rest die schnellste Lösung.
Wenn aber Sortieren nicht gewünscht oder vllt sogar nicht nutzbar für den eigtl Gebrauch der Tabelle ist, wie bekommt man nach Sortieren/Löschen der "x"-Zeilen die Sortierung wieder raus - also die übrig gebliebenen Daten-Zeilen müssen wieder in ihrer ursprünglichen Reihenfolge in der Tabelle erscheinen?
Ciao
Thorsten
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 11:11:36
Werner
Hallo Thorsten,
da würde ich die Methode mit RemoveDuplicates mit Hilfsspalte nehmen. Formel in der Hilfsspalte die bei zu löschenden Zeilen eine 0 ausgibt ansonsten die Zeilennummer. Anschließend Formel durch Werte ersetzen. Daten nach der Hilfsspalte aufsteigend sortieren. Zeilen über RemoveDuplicates löschen. Hilfsspalte leeren.
Die Reihenfolge der verbleibenden Daten hat sich durch die Sortierung nicht geändert, da ja nach der Hilfsspalte sortiert wurde.
Gruß Werner
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 11:26:38
Daniel
Hi
Excel hat eine "stabile" Sortiermethode, dh. alle Zeilen mit gleichem Sortierkriterium behalten ihre Reihenfolge zu einander.
Dh wenn die anderen Zellen leer sind oder den gleichen Wert enthalten, kann man bedenkenlos sortieren ohne zurücksortieren zu müssen.
Die meisten Tabellen haben eine Spalte, über die die gewünschte Reihenfolge wieder hergestellt werden kann. Falls nicht, fügt man als erstes temporär der Tabelle eine Hilfsspalte mit der Zeilennummer hinzu, über die man zurücksortieren kann. Diese Spalte löscht man am Schluss wenn sie nicht mehr benötigt wird.
Duplikate entfernen ist auch unsortiert sehr schnell (zwar nicht ganz so schell wie Sortieren und löschen, aber in der Regel reichts).
Deshalb und auch weil es über die Formel am fexibelsten bezüglich der Löschbedingungen ist, ist es meine bevorzugte Standardmethode zum löschen von Zeilen mit Bedingung.
Gruß Daniel
Anzeige
AW: Makro, Rows(i).Delete -- schneller?
22.09.2021 10:56:39
Fred
Vielen Vielen Dank an
Fennek, Werner, Thorsten, UweD, Oberschlumpf und Daniel !
Das sind wirklich eine Menge an Beispielcodes, Anregungen und Erklärungen auf meine Frage.
Ich werde mich heute damit Beschäftigen und bei einer Lebenserwartung von über 78 Jahren sicherlich auch die für mich beste Möglichkeit finden :-)
Vielen Vielen Dank ALLEN !!
Gruss
Fred

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige