Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1024to1028
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

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

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

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


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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige