Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Makro - Doppelte Zeilen finden und löschen

Makro - Doppelte Zeilen finden und löschen
Chris
Liebe Forumsmitglieder,
ich schreibe zur Zeit an meiner Masterarbeit und würde mich über einen guten Tipp zu meinem Excel Makro freuen. Ich arbeite noch nicht so lange mit Makros, brauche jedoch Makros um meine große Datenbank zu gestalten. Über Hilfe würde ich mich sehr freuen.
Damit klar ist worum es geht, anbei ein kurzer Ausschnitt meiner Datenbank:
https://www.herber.de/bbs/user/79483.xlsm
Ich habe auch schon ein Makro welches funktioniert, bei derzeit 130.000 Zeilen aber zeitlich versagt:
------------ Makro Code (1) -------------------------------------------------------------------- _ -----------------------

Sub Delete_Double_Entries_1()
Dim t As Single
t = Timer
Dim ii, jj As Long
For ii = 1 To Range("G130000").End(xlUp).Row
For jj = ii + 1 To Range("G130000").End(xlUp).Row
'## Delete row if at least the three given arguments are true;
'## ii is running through all rows and jj through all rows below ii
While Cells(ii, 9) = Cells(jj, 9) And Cells(ii, 6) = Cells(jj, 6) And Cells(ii, 3) =  _
Cells(jj, 3) And Cells(ii, 2) = Cells(jj, 2) And Not (Cells(ii, 1) = Cells(jj, 1))
Rows(jj).Delete
Wend
Next jj
Next ii
Debug.Print Timer - t
End Sub

----------------------------------------------------------------------------------------------------------------------------
Mein Ziel ist es nun die Datanbank nach Proposal zu sortieren um dann Paketweise die Daten anzugehen. Und zwar wie folgt:
------------ Makro Code (2) -------------------------------------------------------------------- _ -----------------------

Sub Delete_Double_Entries_2()
Dim x, y As Long
Application.ScreenUpdating = False
For x = 1 To Range("G100").End(xlUp).Row
Do While Cells(x, 6) = Cells(x + 1, 6)
For y = x To y + 10
If Cells(y, 9) = Cells(y + 1, 9) And Cells(y, 6) = Cells(y + 1, 6) And Cells(y, 3) = _
_
Cells(y + 1, 3) And Cells(y, 2) = Cells(y + 1, 2) And Not (Cells(y, 1) = Cells(y + 1, 1)) Then
Rows(y + 1).Delete
End If
Next
Loop
Next
'Sheets("Output").Range("A1000000").End(xlUp).Offset(0, 1) = Rows(y + 1) And
Application.ScreenUpdating = True
End Sub

----------------------------------------------------------------------------------------------------------------------------
Mit "Cells(x, 6) = Cells(x + 1, 6)" soll das Proposalpaket abgearbeitet werden um nicht jedes Mal 130.000 Einträge abzuarbeiten.
" For y = x To y + 10" sollte dies auf die kommenden zehn Zeilen beschränken.
Anschließ soll eine als doppelt identifizierte Zeile (der Fondname muss anders sein) gelöscht werden. Wobei zur gewissenhaften Prüfung der Arbeit die Zeile idealerweise in ein anderes Blatt kopiert wird.
Fazit: Wenn das Makro funktioniert sollte in der Beispieldatei die grüne Ziele stehen bleiben, die rote abernicht.
Ich würde mich über Eure Hilfe sehr freuen. Ich hoffe ich konnte alle benötigten Informationen hier ablegen. Falls etwas unklar ist, eine kurze Nachricht im Forum wäre super :)
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
22.03.2012 05:02:22
Ass
Hallo Chris,
ich habe mir erlaubt, dein Makro etwas zu kürzen. Hier das Ergebnis:
Sub Makro1()
ActiveSheet.Range("$A$1:$I$23").RemoveDuplicates Columns:=Array(2, 3, 6, 9), Header:=xlYes
End Sub
Für Range("$A$1:$I$23") kann man auch Range("A2").CurrentRegion oder den Namen der Datenbamk einsetzen. Im Bedarfsfall vorher nach Spalte C sortieren.
Wobei zur gewissenhaften Prüfung der Arbeit die Zeile idealerweise in ein anderes Blatt kopiert wird.

Wozu? Bei gewissenhafter Prüfung des Makros in der Entwicklung sollte es das Richtige tun und nicht immer wieder kontrolliert werden müssen.
Gruß
Rudi
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
22.03.2012 11:31:50
Chris
Hallo Rudi,
wow, das sieht super aus! Ein kleiner Haken ist aber noch dran, liegt aber an meiner Beschreibung. Wichtig ist, dass das Makro nur löscht, wenn sich Zeile 1 unterscheidet. Besteht die Möglichkeit dies im Array zu berücksichtigen?
Sub Makro1()
ActiveSheet.Range("$A$1:$I$23").RemoveDuplicates Columns:=Array(2, 3, 6, 9), Header:=xlYes
End Sub
Also quasi "And Not (Cells(ii, 1) = Cells(jj, 1)" oben mit einbauen?
Besten Dank! Das Makro sieht auf jeden Fall sehr schlank und effizient aus. Daumen hoch!
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
22.03.2012 12:38:18
Chris
Hallo Rudi, hallo an alle anderen Forumsnutzer,
um mein Problem noch etwas verständlicher darzustellen habe ich das Datenbankbeispiel aktualisiert.
Das Makro sollte bis Zeile 12 merken, dass die Zeilen die kommen nicht doppelt sind. Danach stellt das Makro fest, dass Zeile 13 KOMPLETT identisch ist und löscht diese Zeile nicht (da der Fondname gleich ist). Zeile 14 soll dann gelöscht werden, weil die Zellen B-I der Zeile identisch sind, aber nicht Zelle A, der Fondname.
Anbei die Beispieldatei:
https://www.herber.de/bbs/user/79500.xlsm
Danke an Rudi schon mal, vielleicht findet sich noch eine "schnellere" Lösung (siehe 1. Beitrag).
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
22.03.2012 13:39:13
Ass
Hallo Chris, so geht's (hoffentlich) und schnell:
du wirst doch sicherlich rechts noch eine Spalte frei haben;)
die nehmen wir, um per Formel die besagte Zeile zu ermitteln, die stehen bleiben soll.
In diesem Fall in Spalte J ab J3: =((A2=A3)*(B2=B3)*(C2=C3)*(F2=F3)*(I2=I3))*1
Also das macht natürlich das Makro.
Dann beziehen wir beim Dublikate -Löschen die Spalte J mit ein, die sich ja nun durch das Formelergebnis unterwscheidet.
Zuletzt wird die Spalte J wieder gelöscht.
Sub Makro1()
With Range("$j$3")
.FormulaR1C1 = _
"=((R[-1]C[-8]=RC[-8])*(R[-1]C[-7]=RC[-7])*(R[-1]C[-4]=RC[-4])*(R[-1]C[-1]=RC[-1]))*1"
.AutoFill Destination:=Range("J3:J24"), Type:=xlFillDefault
End With
ActiveSheet.Range("$A$1:$j$24").RemoveDuplicates Columns:=Array(2, 3, 6, 9, 10), Header:=xlYes
Columns("j:j").ClearContents
End Sub
Gruß
Rudi
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
22.03.2012 15:28:59
Chris
Hallo Rudi,
besten Dank für deine Hilfe. Leider ist folgendes passiert:
https://www.herber.de/bbs/user/79503.xlsm
Stimmt die Formel? Wichtig ist, dass die zu löschende Zeile nicht zwingend im Anschluss kommt. Vielmehr kommt es vor, dass die Zeile(n) viel später in der Datenbank kommen.
Im Beispiel ist Zeile 13 die entscheidene Zeile. In Zeile 13 kommt diese zum ersten Mal vor, soll also stehen bleiben. Später dann kommt exakt diese Zeile wieder in Zeile 28 vor. Hier jedoch mit anderem Fondnamen. Also löschen.
Zeile 29 hat ein anderes Datum, also behalten.
Zeile 30 und 31 sind Wiederholungen der Urspungszeile 13. Da der Fondname wie in Zeile 13 ist können auch diese stehenbleiben.
Hoffe das hilft zum Verständnis. Ich tippe, dass die Formel in Spalte J dies nicht ganz erfasst. Die Idee mit Spalte J kann ich auf jeden Fall nachvollziehen, so dass wir J mit in das Array nehmen können.
Anzeige
AW: Makro - Doppelte Zeilen finden und löschen
23.03.2012 06:00:10
Ass
Hallo Chris,
1. ich sehe den Datensatz der Zeile 13 schon in der 2.Zeile das erste mal auftauchen.
2. Die 3. Beispieldatei ist das komplette Gegenteil von der 2.Beispieldatei.
Die beiden haben mit der ursprünglich gestellten Frage gar nichts mehr gemeinsam.
Das ist verworren und ich habe heute keine Zeit.
Vorschlag:
Baue eine aussagekräftige Beispieldatei auf mit 2 Beispielen (welche Löschen, welche stehen bleiben), die sich in Spalte F unterscheiden.
Fange die ganze Fragestellung von vorn an. Hier wird sich vermutlich keiner mehr melden.
Gruß
Rudi
Anzeige
;

Forumthreads zu verwandten Themen

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 mit VBA finden und löschen


Schritt-für-Schritt-Anleitung

Um doppelte Zeilen in Excel zu finden und zu löschen, kannst Du ein VBA-Makro verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Deine Excel-Arbeitsmappe und drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste im Projektfenster und wähle Einfügen > Modul.

  3. Füge den folgenden Code ein:

    Sub DoppelteZeilenLoeschen()
       Dim rng As Range
       Dim zeile As Range
       Set rng = ActiveSheet.Range("A1").CurrentRegion
    
       For Each zeile In rng.Rows
           If Application.WorksheetFunction.CountIf(rng, zeile.Value) > 1 Then
               zeile.Delete
           End If
       Next zeile
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Starte das Makro: Drücke ALT + F8, wähle DoppelteZeilenLoeschen und klicke auf Ausführen.

Dieses Makro sucht nach doppelt vorhandenen Zeilen in Deinem aktiven Blatt und löscht sie. Du kannst die Range("A1").CurrentRegion anpassen, um nur bestimmte Bereiche zu durchsuchen.


Häufige Fehler und Lösungen

  • Fehler: Das Makro löscht nicht alle doppelten Zeilen.

    • Lösung: Stelle sicher, dass Du die gesamte Datenregion korrekt ausgewählt hast. Es könnte hilfreich sein, die Daten vor dem Ausführen des Makros zu sortieren.
  • Fehler: Fehlermeldung beim Ausführen des Makros.

    • Lösung: Überprüfe, ob Du die richtigen Berechtigungen hast, und dass Deine Excel-Version VBA unterstützt.

Alternative Methoden

Wenn Du VBA nicht verwenden möchtest, kannst Du auch die integrierte Funktion in Excel nutzen:

  1. Markiere den Datenbereich.
  2. Gehe zu Daten > Duplikate entfernen.
  3. Wähle die Spalten aus, in denen Du doppelte Werte finden möchtest.
  4. Klicke auf OK, um die doppelten Zeilen zu löschen.

Um doppelte Zeilen zu finden, kannst Du auch die Bedingte Formatierung verwenden:

  1. Markiere den Bereich.
  2. Gehe zu Start > Bedingte Formatierung > Neue Regel.
  3. Wähle Formel zur Ermittlung der zu formatierenden Zellen verwenden und verwende die Formel =ZÄHLENWENN($A$1:$A$100, A1)>1.
  4. Wähle eine Formatierung aus und klicke auf OK.

Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du doppelte Zeilen in Excel identifizieren und entfernen kannst:

  • Beispiel 1: Verwende die RemoveDuplicates-Methode:

    Sub DuplikateEntfernen()
       ActiveSheet.Range("A1:I100").RemoveDuplicates Columns:=Array(2, 3, 6), Header:=xlYes
    End Sub
  • Beispiel 2: Um doppelte Werte zu finden und in ein anderes Blatt zu kopieren, kannst Du Folgendes verwenden:

    Sub DoppelteWerteKopieren()
       Dim ws1 As Worksheet, ws2 As Worksheet
       Set ws1 = ThisWorkbook.Worksheets("Daten")
       Set ws2 = ThisWorkbook.Worksheets("Doppelte")
    
       ws1.Range("A1:I100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws2.Range("A1"), Unique:=False
    End Sub

Tipps für Profis

  • Nutze die Application.ScreenUpdating = False-Anweisung, um die Ausführungsgeschwindigkeit Deiner Makros zu erhöhen, indem Du das Bildschirm-Rendering während der Ausführung deaktivierst.

  • Teste Deine Makros immer an einer Kopie Deiner Daten, um Datenverluste zu vermeiden.

  • Verwende Debug.Print, um den Status Deiner Variablen während der Ausführung zu überwachen.


FAQ: Häufige Fragen

1. Wie finde ich doppelte Zeilen in Excel ohne VBA? Du kannst die Funktion Duplikate entfernen unter dem Daten-Tab verwenden oder die Bedingte Formatierung nutzen, um visuell doppelte Werte hervorzuheben.

2. Was ist der Unterschied zwischen RemoveDuplicates und einem VBA-Skript? RemoveDuplicates ist eine eingebaute Excel-Funktion, die schnell und einfach zu verwenden ist, während ein VBA-Skript maßgeschneiderte Lösungen bietet, die spezifische Anforderungen abdecken können.

3. Wie kann ich doppelte Werte in einer bestimmten Spalte finden? Du kannst die RemoveDuplicates-Methode anpassen, um nur die gewünschten Spalten auszuwählen, oder ein VBA-Skript schreiben, das gezielt nach doppelten Einträgen in bestimmten Spalten sucht.

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