Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Schleife beschleunigen

Schleife beschleunigen
20.11.2008 16:15:00
steffen
Hallo in die Runde,
ich habe eine elendlange tabelle mit ca. 20.000 Zeilen. Es sollen doppelte Einträge rausgeschmissen werden. Den Spezialfilter (keine Duplikate) möchte ich nicht extra nutzen.
Irgendwie dauert die Schleife ewig.
Habt ihr eine Idee, dass zu optimieren?
x = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To x
For j = x To i + 1 Step -1
If Range("A" & j).Value = Range("A" & i).Value Then Rows(j).Delete
Next j
Next i
Gruß Steffen
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife beschleunigen
20.11.2008 17:03:54
robert
hallo,
sollte blitzschnell gehen
gruß
rofu

Sub Filtern()
With ActiveSheet.UsedRange
.Sort Key1:=Range("A2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Cells(1, .Columns.Count + 1), Unique:=True
.EntireColumn.Delete
End With
Columns(3).Insert
End Sub


Anzeige
AW: Schleife beschleunigen
20.11.2008 17:11:00
Rudi
Hallo,
du durchläufst die Schleife ja auch mehrfach.

Sub tt()
Dim iRow As Long
Application.ScreenUpdating = False
For iRow = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Application.CountIf(Columns(1), Cells(iRow, 1)) > 1 Then Rows(i).Delete
Next
Application.ScreenUpdating = True
End Sub


Gruß
Rudi

Anzeige
AW: Schleife beschleunigen
21.11.2008 01:21:56
Daniel
Hi
am schnellsten dürfte das hier sein:

Sub Doppelte_löschen
columns(1).insert
with range(Cells(1,1), cells(rows.count,2).end(xlup).offset(0,-1))
.entirerow.sort Key1:=cells(2,1), order1:=xlascending, header:=xlno
.offset(1,0).formulalocal = "=wenn(B2=B1;"""";Zeile())"
.formula = .value
.entirerow.sort Key1:=cells(1,1), order1:=xlascending, header:=xlno
.specialcells(xlcellypeblanks).entirerow.delete
.entirecolumn.delete
end with
End Sub


bei 20.000 Zeilen kannst du die Methode wahrscheinlch auch ohne Makro von Hand schneller ausführen als jedes Makro mit Schleife.
Gruß, Daniel

Anzeige
Danke Euch
21.11.2008 08:56:05
Steffen
freut mich immer wieder, mit wieviel Fachwissen hier geholfen wird.
Echt super - so macht das richtig Spaß
Gruß
Steffen
AW: @Daniel
21.11.2008 12:39:00
robert
hallo Daniel,
probier mal das
gruß
rofu

Sub Filtern()
With ActiveSheet.UsedRange
.Sort Key1:=Range("A2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Cells(1, .Columns.Count + 1), Unique:=True
.EntireColumn.Delete
End With
Columns(3).Insert
End Sub


Anzeige
AW: @Daniel
21.11.2008 19:09:00
Daniel
Hi
auch ne sehr elegante Lösung mit guter nutzung der eingebauten Excel-Funktionen und auch von Hand sehr einfach anwendbar
hat aber gegenüber meiner Lösung trotzdem noch ein paar Nachteile:
1. ist immer noch etwas langsamer*
2. die Datenmenge wird temporär verdoppelt, dh "nur" in Tabellen mit max 128 Spalten anwendbar (ok, kommt selten vor, aber in grossen Tabellen könnte die Datenmenge schon ein Problem werden
3. es werden nur Zeilen gelöscht, die über alle Spalten mit einer anderen identisch sind. soll nur eine einzelne Spalte über gleich oder nicht gleich entscheiden, kann der Spezialfilter so nicht angewendet werden.
Gruß, Daniel
* Testobjekt war bei mir eine Tabelle mit 20000 Zeilen, bei der jede 2. Zeile gelöscht werden sollte
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Schleife optimieren in Excel


Schritt-für-Schritt-Anleitung

Um die Leistung deiner Schleife in Excel zu steigern, kannst du die folgenden Schritte befolgen. Wir nehmen an, dass du mit VBA arbeitest und eine Tabelle mit ca. 20.000 Zeilen hast:

  1. Verwende Application.ScreenUpdating: Deaktiviere die Bildschirmaktualisierung, um die Ausführung zu beschleunigen.

    Application.ScreenUpdating = False
  2. Optimierte Schleife: Anstatt jede Zeile einzeln zu überprüfen, nutze CountIf, um doppelte Einträge effizient zu identifizieren und zu löschen.

    Dim iRow As Long
    For iRow = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
       If Application.CountIf(Columns(1), Cells(iRow, 1)) > 1 Then
           Rows(iRow).Delete
       End If
    Next iRow
  3. Bildschirmaktualisierung wieder aktivieren:

    Application.ScreenUpdating = True

Häufige Fehler und Lösungen

  • Fehler: Schleife benötigt zu viel Zeit.

    • Lösung: Reduziere die Anzahl der Schleifen und deaktiviere die Bildschirmaktualisierung.
  • Fehler: Fehlermeldung beim Löschen von Zeilen.

    • Lösung: Stelle sicher, dass du von unten nach oben durch die Zeilen iterierst, um Probleme beim Löschen zu vermeiden.

Alternative Methoden

Falls du keine VBA-Makros verwenden möchtest, kannst du die folgenden alternativen Methoden ausprobieren:

  1. Spezialfilter: Nutze den Spezialfilter, um doppelte Werte zu entfernen. Das geht deutlich schneller als eine Schleife.

    ActiveSheet.Range("A1:A20000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
  2. Formeln: Verwende Formeln wie =WENN(A2=A1;"";ZEILE()) in einer Hilfsspalte und filtere anschließend nach leeren Zellen.


Praktische Beispiele

Hier sind einige Beispiele, die du direkt in die Excel VBA-Umgebung einfügen kannst:

Beispiel 1: Doppelte Einträge löschen

Sub Doppelte_löschen()
    Application.ScreenUpdating = False
    Columns(1).Insert
    With Range(Cells(1, 1), Cells(Rows.Count, 2).End(xlUp).Offset(0, -1))
        .EntireRow.Sort Key1:=Cells(2, 1), Order1:=xlAscending, Header:=xlNo
        .Offset(1, 0).FormulaLocal = "=WENN(B2=B1;"""";ZEILE())"
        .Formula = .Value
        .EntireRow.Sort Key1:=Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        .EntireColumn.Delete
    End With
    Application.ScreenUpdating = True
End Sub

Tipps für Profis

  • Nutze Arrays: Wenn du mit großen Datenmengen arbeitest, lade die Daten in ein Array, bearbeite sie und schreibe sie zurück ins Arbeitsblatt. Das reduziert die Anzahl der Interaktionen mit dem Arbeitsblatt und beschleunigt die Ausführung.

  • Vermeide volatile Funktionen: Funktionen wie NOW() oder RAND() in Schleifen können die Ausführung verlangsamen. Verwende diese sparsam.


FAQ: Häufige Fragen

1. Wie kann ich die Laufzeit meiner Makros messen? Du kannst die Timer-Funktion verwenden, um die Zeit zu messen, bevor und nachdem dein Code ausgeführt wird.

2. Gibt es eine Möglichkeit, die Anzahl der doppelten Einträge vor dem Löschen zu zählen? Ja, du kannst die Funktion Application.CountIf verwenden, um die Anzahl der doppelten Einträge zu zählen, bevor du sie löschst.

3. Ist es sicher, mit großen Datenmengen in Excel zu arbeiten? Ja, Excel kann mit großen Datenmengen umgehen, jedoch ist es ratsam, regelmäßig Backups zu erstellen und deine Daten zu überprüfen, um den Verlust von Informationen zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige