6.8k Aufrufe
Gefragt in Tabellenkalkulation von berliner85 Einsteiger_in (43 Punkte)
Hallo zusammen,

ich habe das Forum nach ähnlichen Beiträgen schon durchsucht, doch leider war keine passende Lösung dabei, daher hoffe ich auf Ihre Unterstützung. Bin in VBA noch totaler Anfänger.

Situation ist folgende: über eine Importfunktion werden aus zwei Excel-Dateien die Inhalte kopiert und zusammengefasst. Es handelt sich um Kundenlisten.

Liste A = BESTAND
Liste B = NEU

Folgende Spalten werden innerhalt der Listen verwendet:
Name, Vorname, Straße, Hausnr., PLZ, Ort, Telefon

Nun wurde mir eine Funktion geschrieben, die Dubletten löscht, jedoch mit einer Besonderheit.

Sobald doppelte Datensätze sich in drei von vier festgelegten Kriterien gleichen, sollen BEIDE Datensätze gelöscht werden.

Die vier Kriterien entsprechen den vier Spalten Name, Vorname, PLZ, Telefon

Nochmal zum Verständnis... es soll eine Kontaktliste erstellt werden. Möglicherweise gibt es mehrere Hans Müller, aber sobald der Datensatz "Hans Müller" die gleiche PLZ oder TELEFON enthält, sollen BEIDE vergleichende Datensätze (oder mehrere) gelöscht werden.

Anschließend wird die Liste nach Name aufsteigend sortiert.

Die Lösung, die ich habe, funktioniert soweit ganz gut. Aber ich hatte einen Denkfehler, der mich nun völlig überfordert.

Derzeit werden die Daten aus Liste BESTAND und Liste NEU importiert, in eine Liste zusammengefügt und um Dubletten bereinigt.

Richtig soll aber sein, dass aus der Liste NEU alle Datensätze gelöscht werden, die BESTAND enthält und DANACH die Daten aus BESTAND komplett gelöscht werden sollen.

So das eine Liste NEU bereinigt mit BESTAND entsteht.

Können Sie mir da helfen? Wo setze ich an??

Hier der Code zum Bereinigen:

Sub Dublettenbereinigung()
Dim Spalten(1 To 4) As Long
Dim sp As Long
Dim i As Long
Dim Fo As String

'--- Hier Zeilen- und Spaltennummern eintragen

Const ErsteDatenZeile As Long = 3
Spalten(1) = 1 ' Spaltennummer Name
Spalten(2) = 2 ' Spaltennummer Vorname
Spalten(3) = 5 ' Spaltennummer PLZ
Spalten(4) = 7 ' Spaltennummer Telefon


'--- Prüfformel für Duplikate erstellen
Fo = "=If(or(((RCw=R[-1]Cw)+(RCx=R[-1]Cx)+(RCy=R[-1]Cy)+(RCz=R[-1]Cz))>=3,((RCw=R[1]Cw)+(RCx=R[1]Cx)+(RCy=R[1]Cy)+(RCz=R[1]Cz))>=3),1,"""")"

For i = 1 To 4
Fo = Replace(Fo, Chr(Asc("v") + i), Spalten(i))
Next

With Range(Cells(ErsteDatenZeile, 1), Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To 4
'--- Sortieren, so das Duplikate untereinander stehen
For sp = 1 To 4
If sp <> i Then .Sort Key1:=.Cells(1, Spalten(sp)), order1:=xlAscending, Header:=xlNo
Next
'--- per Formel auf Dupliakte prüfen und Zeilen löschen
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = Fo
.Formula = .Value
If WorksheetFunction.Sum(.Cells) > 0 Then
.EntireRow.Sort Key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo
.SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
End If
.ClearContents
End With
Next

'--- Sortieren nach Namen
.Sort Key1:=.Cells(1, Spalten(1)), order1:=xlAscending, key2:=.Cells(1, Spalten(2)), order2:=xlAscending, Header:=xlNo

End With

End Sub

20 Antworten

0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Ich korrigiere mich, er löscht doch an die 70 Datensätze, aber durch die Auflistung direkt untereinander kann man eben die ganzen Dubletten sehen.

Auch denke ich, dass Deine Dublettenbereinigung auch nicht richtig funktioniert, kannst Du da nicht die alte einfach mit reinbasteln? Die hatte ich schon geprüft. Die funktioniert wunderbar. Sie prüft ob DREI VON VIER KRITERIEN übereinstimmen. Welche das sind, ist aber völlig egal. Name, PLZ und Telefon kann gleich sein, aber auch Vorname, PLZ usw.

Wie lange benötigt er bei Dir denn für das Ausführen des Makros "Daten bereinigen"?

Bei mir so 1-2 Minuten. Er spuckt aber auch keine Fehlermeldung aus oder kann man das irgendwo einstellen?

Hab übrigens Office 2013...vielleicht liegt es daran?
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

das Makro prüft, ob Name und Vorname gleich sind und falls das erfüllt ist, wird geprüft, ob PLZ oder Telefonnummer übereinstimmen.
Schreibe doch noch einmal genau, was geprüft werden soll bzw. übereinstimmen soll, damit die Datensätze gelöscht werden.

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Na ja, bei Dir funktioniert es aufbauend, wenn Name und Vorname gleich, dann...

Es sollen aber die vier Kriterien unabhängig der Reihenfolge geprüft werden.

Bsp: Hans Müller kann es mehrfach geben, sich vielleicht aber von Ort und somit Telefonnummer unterscheiden. Es kann aber auch die Frau von Hans in der Liste sein, die heißt Monika. Aber auch Monika soll gelöscht werden, denn sie hat die gleiche PLZ und Telefonnummer. Vielleicht hat Hans mittlerweile geheiratet und den Nachnamen Schulz angenommen, dann muss der Datensatz trotzdem gelöscht werden, da PLZ und Telefonnummer identisch sind.

Dennoch funktioniert das Makro bei mir nicht, diese beiden Datensätze sind ein Beispiel:

Amboss Susi Bergstraße 40 22059 Hamburg 012345678
Amboss Susi Bergstraße 40 22059 Hamburg 012345678

Völlig identische Datensätze, die nicht gelöscht werden. Mmh.

Echt vielen Dank, dass Du Dich da mit mir durchwuschelst.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

heißt das, dass in der Import-Datei auch identische Datensätze sein können, von denen dann einer gelöscht werden muss?

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Nicht nur einer, ALLE doppelten Datensätze sollen gelöscht werden. Kein Eintrag soll stehenbleiben, wo die Kriterien zutreffen.

Es soll eine Liste entstehen, mit völlig neuen Daten, die nicht in der Bestandsliste auftauchen...daher auch NEUEADRESSEN minus BESTAND....aber eben VORHER (!!) die Dublettenbereinigung mit Daten aus BEIDEN QUELLEN...das ist sehr wichtig!

Also Import der Daten
Löschen der Dubletten
Bereinigung der Daten mit Datensätze aus dem BESTAND
= NEUE LISTE MIT BEREINIGTEN Daten

:)
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

Ziel soll es sein, dass eine Liste mit Datensätzen entsteht, die nicht in der Bestandsliste stehen und in der keine doppelten Datensätze vorhanden sein dürfen. Ist das so richtig?

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Richtig.

Die Datei NEUEADRESSEN enthält neue Adressen, kann aber auch Datensätze enthalten, die bereits im BESTAND sind. Daher müssen diese Datensätze bereinigt werden.

Da aber im Bestand Lieschen Müller mit Telefonnummer, etc. aufgelistet sein kann und Hans Müller mit den gleichen Daten in der NEUEADRESSEN-Datei, müssen vor der Bereinigung der Daten (NEUE ADRESSEN minus BESTAND) die doppelten Datensätze nach den vorgegebenen Kriterien (3 von 4 identisch) gelöscht werden.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

also hier der nächste Versuch :-): Dublettenbereinigung Neu3

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Es dauert bei mir so mindestens 5 Minuten...ist das normal?

Aber es scheint so, als wenn es funktioniert. Es sind auf jeden Fall ein paar Hundert Datensätze weniger und ich kann keine doppelten Einträge erkennen.

Jedoch ist mir aufgefallen, dass er nach Straße aufgehend sortiert ... der Nachname wäre besser geeignet.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

hier die überarbeitete Version: Dublettenbereinigung neu4

Gruß

M.O.
...