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

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 :)
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!
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

325 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige