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

Finden von Mehrfacheinträge beschleunigen

Finden von Mehrfacheinträge beschleunigen
Mehrfacheinträge
Hallo Leuts,
kann ich diesen Code beschleunigen. Bei einigen hundert Zeilen brauch der ja ne Ewigkeit :(
Also es sollen die Mehrfacheinträge in der Liste komplett stehen bleiben.
Meine Idee ist, die Einzeleinträge einfach zu löschen.
lrow = Cells(Rows.Count, 1).End(xlUp).Row
For c = lrow To 2 Step -1
If WorksheetFunction.CountIf(Range(Cells(2, b), Cells(lrow, b)), Cells(c, b)) = 1 Then
Rows(c).Delete
End If
Next c
Gruß Steffen

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Finden von Mehrfacheinträge beschleunigen
13.10.2009 16:35:49
Mehrfacheinträge
Hi.
Application.ScreenUpdating = False
vor den Code und danach wieder auf True setzen.
Das beschleunigt ungemein.
Oder ersetz es dadurch, das könnte bei sehr großen Datenmengen (bei 1500 Zeilen habe ich aber noch nicht groß was gemerkt) schneller sein:
Sub test()
Dim delRng As Range
Dim c As Long
Dim lRow As Long
' zu prüfende Spalte, mußte ich zum Test so einsetzen
Const b = 2
lRow = Cells(Rows.Count, 1).End(xlUp).Row
For c = 2 To lRow
If WorksheetFunction.CountIf(Range(Cells(2, b), Cells(lRow, b)), Cells(c, b)) = 1 Then
If delRng Is Nothing Then
Set delRng = Rows(c)
Else
Set delRng = Union(delRng, Rows(c))
End If
End If
Next c
Application.ScreenUpdating = False
If Not delRng Is Nothing Then delRng.Delete
Application.ScreenUpdating = True
End Sub
Gruss, Jogy
Anzeige
AW: Finden von Mehrfacheinträge beschleunigen
13.10.2009 16:37:38
Mehrfacheinträge
Hallo Steffen,
schalte die Berechnung aus und schreibe die Zeilen die gelöscht werden sollen erst auf eine Variable und lösche zum schluss. Nach folgendem Prinzip.
Sub Leerzeilen_loeschen()
'   alle Leerzeilen löschen
Dim LoI As Long
Dim RaZeile As Range
Application.ScreenUpdating = False
For LoI = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
If Application.WorksheetFunction.CountA(Rows(LoI))  ActiveSheet.UsedRange. _
SpecialCells(xlCellTypeLastCell).Column Then
If Rows(LoI).SpecialCells(xlCellTypeBlanks).Count = ActiveSheet.UsedRange. _
SpecialCells(xlCellTypeLastCell).Column Then
If RaZeile Is Nothing Then
Set RaZeile = Rows(LoI)
Else
Set RaZeile = Union(RaZeile, Rows(LoI))
End If
End If
End If
Next LoI
If Not RaZeile Is Nothing Then RaZeile.Delete
Application.ScreenUpdating = True
Set RaZeile = Nothing
End Sub

Anzeige
AW: Finden von Mehrfacheinträge beschleunigen
13.10.2009 16:38:11
Mehrfacheinträge
Hallo Steffen,
versuch es so - wobei ich nicht weiß, wie bei Dir b definiert worden ist.
Public Sub Neuer_Versuch()
Dim lRow     As Long
Dim lZeile   As Long
Dim rZeile   As Range
lRow = Cells(Rows.Count, 1).End(xlUp).Row
For lZeile = lRow To 2 Step -1
If WorksheetFunction.CountIf(Range(Cells(2, b), Cells(lRow, b)), Cells(lZeile, b)) = 1  _
Then
If rZeile Is Nothing Then
Set rZeile = Rows(lZeile)
Else
Set rZeile = Union(rZeile, Rows(lZeile))
End If
End If
Next lZeile
If Not rZeile Is Nothing Then rZeile.Delete ' Zeilen löschen
Set rZeile = Nothing
End Sub
Gruß Peter
Anzeige
am schnellsten sind oft Formelbasierte Lösungen
13.10.2009 22:31:36
Daniel
Hi
die schnellste Variante ist folgende, diese Variante funktioniert auch mit beliebigen Datenmengen und ist bei grossen Datenmengen auch von Hand schneller als die meisten Makros, die auf Schleifen basieren:
1. Daten nach der Spalte mit dem Vergleichskriterium sortieren (in diesem Fall Spalte b)
2. am Tabellenende folgende Formel eintragen (Formel ist geschrieben für die Zeile 2, da ich von einer Überschrift ausgehe: =Wenn(Oder(B1=B2;B2=B3);Zeile();"")

3.mit Kopieren - Inhalte einfügen - Werte die Formel fixieren
4. Datei nach der neuen Spalte sortieren.
5. in der neuen Spalte die leeren Zellen selektiern und dann die ganze Zeile löschen (geht über BEARBEITEN - GEHE ZU - INHALTE - LEERZELLEN, anschließend BEARBEITEN - ZELLEN LÖSCHEN - GANZE ZEILE)
als Makro sieht das ganze so aus:
Sub EinfacheLöschen()
Const b = 2 'hier die Spalte mit den Vergleichswerten eintragen
With ActiveSheet.UsedRange
.Sort Key1:=Cells(b, 2), order1:=xlAscending, header:=xlYes
With .Columns(.Columns.Count).Offset(1, 1).Resize(.Rows.Count - 1, 1)
.FormulaR1C1 = "=if(or(R[-1]C" & b & "=RC" & b & ",R[1]C" & b & "=RC" & b & "),Row(),""" _
")"
.Formula = .Value
.EntireRow.Sort Key1:=.Cells(1, 1), order1:=xlAscending, header:=xlNo
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
On Error GoTo 0
.Delete
End With
End With
End Sub
Gruß, Daniel
Anzeige
AW: korrektur
13.10.2009 23:59:36
Daniel
Sorry, kleiner Tippfehler, so läuft das Makro richtig:
Sub EinfacheLöschen()
Const b = 1 'hier die Spalte mit den Vergleichswerten eintragen
With ActiveSheet.UsedRange
.Sort Key1:=Cells(2, b), order1:=xlAscending, header:=xlYes
With .Columns(.Columns.Count).Offset(1, 1).Resize(.Rows.Count - 1, 1)
.FormulaR1C1 = _
"=if(or(R[-1]C" & b & "=RC" & b & ",R[1]C" & b & "=RC" & b & "),Row(),"""")"
.Formula = .Value
.EntireRow.Sort Key1:=.Cells(1, 1), order1:=xlAscending, header:=xlNo
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
On Error GoTo 0
.Delete
End With
End With
End Sub

Gruß, Daniel
Anzeige
Riesendank...
14.10.2009 15:47:51
steffen
Echt der Hammer, welches Niveau hier herrscht.
Danke auch für die Erklärungen.
So macht das Forum wirklich spaß.
Gruß Steffen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige