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

Forumthread: Doppelte zeilen löschen

Doppelte zeilen löschen
02.04.2013 08:02:03
Gregor
Hallo zusammen
Aus dem Forum habe ich vor längerer Zeit untenstehendes Makro gepostet. Bei ca 2000 Zeilen _ dauert das jedoch sehr lange. Gibt es eine schnellere Variante?

Sub DoppelteWerte_löschen()
Application.ScreenUpdating = False
Application.EnableEvents = False
intRow = Cells(Rows.Count, 1).End(xlUp).Row
For Start = intRow To 1 Step -1
If Not IsEmpty(Cells(Start, 1)) Then
If Application.CountIf(Columns(1), Cells(Start, 1)) > 1 Then
Cells(Start, 1).ClearContents
End If
End If
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Vielen Dank und Gruss
Gregor

Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Doppelte zeilen löschen
02.04.2013 08:04:28
Hajo_Zi
Hallo Gregor,
warum benutzt Du nicht die Funktion die Excel schon hat?
Register Daten, Befehlsgruppe Datentools, Duplkate entfenen.

AW: Doppelte Zellen löschen
02.04.2013 08:31:59
Gregor
Hallo Hajo
Es dürfen nur die doppelten Einträge in den Zellen der Spalte 1 gelöscht werden, nicht die ganzen Zeilen. Und zwar von unten nach oben, sodass immer der oberste Eintrag stehen bleibt.
Zudem will ich diesen Code in ein Makro einbauen.
Danke und Gruss
Gregor

Anzeige
AW: Doppelte Zellen löschen
02.04.2013 08:40:47
hary
Moin Gregor
Probier mal ob der schneller ist.
Dim i As Long
Dim lz As Integer
Dim raus As Range
Application.ScreenUpdating = False
lz = Cells(Rows.Count, 1).End(xlUp).Row
For i = 4 To lz
If Application.CountIf(Columns(1), Cells(i, 1)) > 1 Then
If raus Is Nothing Then
Set raus = Cells(i, 1)
Else
Set raus = Union(raus, Cells(i, 1))
End If
End If
Next i
If Not raus Is Nothing Then raus.ClearContents
Application.ScreenUpdating = True

gruss hary

Anzeige
AW: Doppelte Zellen löschen
02.04.2013 08:42:30
Hajo_Zi
Hallo Gregor,
ungetestet.
Option Explicit
Sub DoppelteWerte_löschen()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim RaZelle As Range
Dim IntRow As Long
Dim Start As Long
IntRow = IIf(IsEmpty(Cells(Rows.Count, 1)), _
Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
For Start = IntRow To 1 Step -1
If Not IsEmpty(Cells(Start, 1)) Then
If Application.CountIf(Columns(1), Cells(Start, 1)) > 1 Then
If RaZelle Is Nothing Then
Set RaZelle = Cells(Start, 1)
Else
Set RaZelle = Union(RaZelle, Cells(Start, 1))
End If
End If
End If
Next
If Not RaZelle Is Nothing Then RaZelle.ClearContents
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Gruß Hajo

Anzeige
AW: Doppelte Zellen löschen
02.04.2013 08:44:37
Hajo_Zi
Hallo Gregor,
noch kleiner Fehler.
Option Explicit
Sub DoppelteWerte_löschen()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim RaZelle As Range
Dim IntRow As Long
Dim Start As Long
IntRow = IIf(IsEmpty(Cells(Rows.Count, 1)), _
Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
For Start = IntRow To 1 Step -1
If Not IsEmpty(Cells(Start, 1)) Then
If Application.CountIf(Range("A1:A" & Start), Cells(Start, 1)) > 1 Then
If RaZelle Is Nothing Then
Set RaZelle = Cells(Start, 1)
Else
Set RaZelle = Union(RaZelle, Cells(Start, 1))
End If
End If
End If
Next
If Not RaZelle Is Nothing Then RaZelle.ClearContents
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Gruß Hajo

Anzeige
AW: Doppelte Zellen löschen
02.04.2013 09:47:52
Gregor
Hallo
Auch derjenige von Hajo läuft schnell und richtig.
Vielen Dank
Gregor

intRow?
02.04.2013 08:39:21
Klaus
Hallo Gregor,
eine offtopic-Anmerkung:
wie ist intRow denn dimensioniert? Die Notation sieht aus, als wäre es ein Integer. Solange deine Tabelle weniger als 32.767 Zeilen hat ist das unproblematisch, aber alleine da es in Excel die Möglichkeit gibt mehr Zeilen anzusprechen sollte jede sich auf Zeilen beziehende Variable schon aus Prinzip als Long dimensioniert - und dann auch entsprechend benannt (lngRow)werden.
Der Funktionalität deines Codes tut das keinen Abbruch, es ist nur pedantisches Geschwätz!
Ontopic:
Eine Schleife über x-tausend Zeilen, in der am besten noch Operationen vorkommen, ist immer sehr langsam.
Die üblichen Verdächtigen Vorschläge wären jetzt: schalte xlCalculate aus, oder sammel die Zeilen in einem Union und lösche sie dann auf einen Schlag wenn die Schleife um ist, oder bastel dir die Bedingung zum Löschen in einer Hilfsspalte um den Löschbereich ohne Schleife per Autofilter oder Range().SpecialCells() rasend schnell zu löschen.
Aber Hajo hat da schon recht: Es gibt in Excel (seit 2007?) die Funktion "Doppelte löschen". Diese einmal durch den Makrorekorder, dann hast du den schnellstmöglichen Code.
Was Hajo nicht bedacht hat: "Doppelte löschen" entfernt die gesamte Zeile. Dein Code behält die Zeilen (da du .ClearContent statt .Delete nutzt) und leert nur die Inhalte.
Es ist etwas kontra-intuitiv dass deine Schleife rückwärts läuft (step -1), da deine CountIf Abfrage eh die gesamte Spalte abfragt und dieser relativ egal ist, ob sie von oben oder von unten prüft. Aber wir kennen ja deine restliche Datenstruktur nicht, vielleicht sind unten ja "ältere" Daten in den anderen Spalten? Ausserdem hast du "löschen" statt "leeren" im Betreff geschrieben. Ich nehme an Hajo hat sich dadurch ablenken lassen und deinen Code nicht so sorgfältig gelesen wie ein Antworter auf Spizenniveau es eigentlich machen sollte - bitte das nächste mal präzisere Fragen stellen, weil wir hier alle so pedantisch sind (siehe auch meine Ausführung weiter oben).
Also, Gregor, bitte eine kurze Rückmeldung:
1) hilft dir das Boardmittel "Duplikate Löschen" von Excel bereits weiter oder
2) brauchst du eine Makrolösung, die Zeilen nur leert und nicht löscht?
Wenn 2), dann bitte auch diese beantworten:
2a) es darf eine Hilfsspalte genutzt werden
2b) es darf ein Autofilter genutzt werden
2c) du lädst eine Musterdatei hoch, damit ich das nicht "blind" bauen muss.
Grüße,
Klaus M.vdT.

Anzeige
AW: intRow?
02.04.2013 09:39:41
Gregor
Hallo zusammen
Vorab vielen Dank und ja, mit Zeile löschen habe ich mich nicht präzis ausgedrückt, sorry. IntRow habe ich als Public mit as Long definiert.
Die Beiden Vorschläge habe ich getestet, beide leeren in der Spalte A zu viele Zellen (für mich willkürlich).
Zu deinen Fragen:
1) Die Excel-Funktion Duplikate löschen hilft mir nicht weiter, weil ganze Zeilen gelöscht werden
2) Ich benötige eine Makrolösung die Zellen leert und nicht Zeilen löscht
2a und b) Grundsätzlich darf schon eine Hilfsspalte und/oder AutoFilter genutzt werden, wenn diese wieder gelöscht wird.
2c) Ich habe eine Musterdatei hochgeladen
https://www.herber.de/bbs/user/84664.xlsx
Immer der erste Eintrag, also Muster 1 in Zeile 3, dann Muster 2 in Zeile 12, Muster 3 in Zeile 14, usw. soll stehen bleiben.
Vielen Dank und Gruss
Gregor

Anzeige
AW: intRow?
02.04.2013 10:12:05
Klaus
Hallo Gregor,
anbei die Musterdatei mit ein paar Makros
https://www.herber.de/bbs/user/84668.xlsm
(musste das Blatt 1 leer lassen, um im 300kb-Upload zu bleiben. Starte zunächst das Makro "wiederherstellen"!)
Ich habe alle Methoden im Thread ausprobiert, inklusive meiner Vorschläge (special cells und autofilter). Aus dem Bauch heraus würde ich sagen, dass Erichs Methode die beste ist da sie ohne Hilfsspalten auskommt und die wenigsten (langsamen) Operationen im Excelblatt selbst ausführt.
Wenn du die in meiner SpecialCells-Version erzeugten Formeln in einer Hilfsspalte direkt im Blatt stehen lassen kannst statt sie im Makro zu erzeugen, behaupte ich dass ist die schnellste Methode.
Seltsamerweise ist dein als langsam verschrieenes Original in der Musterdatei am schnellsten durchgelaufen:
'Zusammenfassung Zeiten:
'Autofilter-Methode: 0,78 sek
'SpecialCells-Methode: 0,39 sek
'Array-Methode (Erich): 0,39 sek
'Union-Zellen (Hajo und Hary): 0,59 sek
'Original-Methode: 0,34 sek
Warscheinlich hat das was mit berechungen usw. zu tuen ... probier doch die verschiedenen Methoden mal in deiner Masterdatei aus. Mich würd sehr interessieren, welche Methode bei dir am schnellsten läuft!
Grüße,
Klaus M.vdT.

Anzeige
Doppelte Werte löschen
02.04.2013 09:38:02
Erich
Hi Gregor,
das könnte etwas schneller sein:

Option Explicit
Sub DoppelteWerte_löschen()
Dim arrW, varW, zz As Long, rngDel As Range
arrW = Cells(1, 1).Resize(Cells(Rows.Count, 1).End(xlUp).Row)
varW = arrW(1, 1)
For zz = 2 To UBound(arrW)
If varW = arrW(zz, 1) Then
If rngDel Is Nothing Then
Set rngDel = Cells(zz, 1)
Else
Set rngDel = Union(rngDel, Cells(zz, 1))
End If
Else
varW = arrW(zz, 1)
End If
Next
If Not rngDel Is Nothing Then rngDel.ClearContents
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Doppelte Werte löschen
02.04.2013 09:44:44
Gregor
Hoi Erich
Dein Code läuft viel, viel schneller und funktioniert wie gewünscht. Ich habe diesen erst gesehen, als ich die Musterdatei bereits hochgelden hatte. Damit ist mein Anliegen beantwortet.
Vielen Dank an alle
Gruss Gregor

noch eine Alternative
02.04.2013 10:01:42
Erich
Hi Gregor,
danke für deine Rückmeldung!
Das Folgende könntest du auch noch ausprobieren. Hier werden die Werte nicht gelöscht,
sondern mit leeren Zeichenketten überschrieben:

Sub DoppelteWerte_löschen2()
Dim rngF As Range
Set rngF = Cells(3, 23).Resize(Cells(Rows.Count, 1).End(xlUp).Row - 2)
With rngF
.FormulaR1C1 = "=IF(RC1=R[-1]C1,"""",RC1)"
.Copy
Cells(3, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.ClearContents
End With
Cells(3, 1).Select
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
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
Anzeige

Infobox / Tutorial

Doppelte Zeilen in Excel Löschen


Schritt-für-Schritt-Anleitung

Um doppelte Zeilen in Excel zu löschen, kannst Du entweder eine Excel-Funktion oder ein VBA-Makro verwenden. Hier ist eine einfache Anleitung zur Verwendung eines VBA-Skripts:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Füge den folgenden Code in das Modul ein:

    Sub DoppelteWerte_löschen()
       Application.ScreenUpdating = False
       Application.EnableEvents = False
       Dim RaZelle As Range
       Dim IntRow As Long
       Dim Start As Long
       IntRow = Cells(Rows.Count, 1).End(xlUp).Row
       For Start = IntRow To 1 Step -1
           If Not IsEmpty(Cells(Start, 1)) Then
               If Application.CountIf(Columns(1), Cells(Start, 1)) > 1 Then
                   If RaZelle Is Nothing Then
                       Set RaZelle = Cells(Start, 1)
                   Else
                       Set RaZelle = Union(RaZelle, Cells(Start, 1))
                   End If
               End If
           End If
       Next
       If Not RaZelle Is Nothing Then RaZelle.ClearContents
       Application.ScreenUpdating = True
       Application.EnableEvents = True
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus, indem Du auf Entwicklertools > Makros klickst und das Makro auswählst.

Mit diesem Makro werden alle doppelten Werte in der ersten Spalte gelöscht, während der erste Eintrag erhalten bleibt.


Häufige Fehler und Lösungen

  • Problem: Makro läuft langsam.

    • Lösung: Verwende die Union-Methode, um alle doppelten Zellen zu sammeln und sie anschließend auf einmal zu löschen. Dies verbessert die Leistung erheblich.
  • Problem: Doppelte Werte werden nicht korrekt erkannt.

    • Lösung: Stelle sicher, dass die Zellen tatsächlich identisch sind, ohne zusätzliche Leerzeichen. Du kannst die Funktion TRIM() verwenden, um Leerzeichen zu entfernen.

Alternative Methoden

Neben VBA gibt es auch eingebaute Excel-Funktionen, um doppelte Zeilen zu löschen:

  1. Duplikate Entfernen:

    • Gehe zu Daten > Duplikate entfernen.
    • Wähle die Spalte aus, in der Du die Duplikate entfernen möchtest.
  2. Bedingte Formatierung:

    • Du kannst doppelte Werte mit bedingter Formatierung hervorheben, bevor Du sie manuell löschst.

Praktische Beispiele

  1. Einfaches Makro zur schnellen Löschung von doppelten Werten:

    Sub SchnellesDuplikateEntfernen()
       Dim rng As Range
       Set rng = Range("A1:A100") ' Definiere den Bereich
       rng.RemoveDuplicates Columns:=1, Header:=xlNo
    End Sub
  2. Anzeigen doppelter Zeilen:

    Sub DoppelteZeilenAnzeigen()
       Dim rng As Range
       Set rng = Range("A1:A100")
       Dim cell As Range
       For Each cell In rng
           If Application.CountIf(rng, cell.Value) > 1 Then
               cell.Interior.Color = RGB(255, 0, 0) ' Färbt doppelte Zellen rot
           End If
       Next cell
    End Sub

Tipps für Profis

  • Verwende Arrays: Arbeiten mit Arrays anstelle von direkten Zellreferenzen kann die Geschwindigkeit erhöhen.
  • Nutze AutoFilter: Filtere zuerst die doppelten Werte und lösche dann die gefilterten Zeilen.
  • Hilfsspalte verwenden: Füge eine Hilfsspalte hinzu, um doppelten Inhalt zu kennzeichnen, bevor Du eine Löschoperation durchführst.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass das Makro nur die doppelten Werte in einer bestimmten Spalte löscht? Du kannst den Bereich im Makro einschränken, indem Du Set rng = Range("A:A") für die Spalte A verwendest.

2. Gibt es eine Möglichkeit, die doppelten Zeilen zu löschen, ohne die gesamte Zeile zu entfernen? Ja, das oben gezeigte Makro verwendet ClearContents, um nur die Inhalte zu leeren, während die Zeilen erhalten bleiben.

3. Wie kann ich die Geschwindigkeit des Makros verbessern? Reduziere Bildschirmaktualisierungen mit Application.ScreenUpdating = False und verwende die Union-Methode, um mehrere Zellen auf einmal zu löschen.

4. Welche Excel-Version benötige ich für diese Funktionen? Die meisten genannten Funktionen und VBA-Skripte sind in Excel 2007 und späteren Versionen verfügbar.

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