7.4k 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)
Hier der Code zum Importieren:

Option Explicit

Const HomeDatei = "DUBLETTENBEREINIGUNG.xlsm" 'Name Arbeitsmappe Makro-Excel-Datei
Const HomeDaten = "Daten-Import" 'Name Tabellenblatt Daten-Import
Const HomeListe = "Datei-Liste" 'Name Tabellenblatt Datei-Liste
Const HomeZeile = 3 'Erste Zeile Einfügen
Const CopyZeile = 3 'Erste Zeile Kopieren
Const ListDatei = "A1" 'Zelle erster Dateiname
Const ErrMsg = "Abbruch! Datei existiert nicht: "

Sub SheetsImport()

Dim WksHome As Worksheet, WksList As Worksheet, EndLine As Integer, NextLine As Integer

Dim WkbCopy As Workbook, WksCopy As Worksheet, Fso As Object, File As Object

Set Fso = CreateObject("Scripting.FileSystemObject")

Set WksHome = Workbooks(HomeDatei).Sheets(HomeDaten)

Set WksList = Workbooks(HomeDatei).Sheets(HomeListe)

EndLine = GetEndLine(WksHome): NextLine = HomeZeile

If EndLine >= HomeZeile Then WksHome.Rows("3:" & EndLine).Cells.Clear

Application.ScreenUpdating = False

For Each File In WksList.Range(ListDatei).CurrentRegion

If Fso.FileExists(File) = False Then

Application.ScreenUpdating = True

MsgBox ErrMsg & File, vbExclamation, "Fehler": Exit Sub

End If

Set WkbCopy = Workbooks.Open(File): Set WksCopy = WkbCopy.Sheets(1)

EndLine = GetEndLine(WksCopy)

If EndLine >= CopyZeile Then

WksCopy.Rows("3:" & EndLine).Copy

WksHome.Rows(NextLine).Insert Shift:=xlDown

Application.CutCopyMode = False

WkbCopy.Saved = True: WkbCopy.Close

NextLine = GetEndLine(WksHome) + 1

End If

Next

Application.ScreenUpdating = True


End Sub
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

ich habe es gelesen, aber irgendwie nicht verstanden:

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.


Dass in der Liste NEU alle Datensätze, die in der Liste BESTAND vorkommen gelöscht werden sollen verstehe ich ja noch. Aber danach?
Die Liste BESTAND soll komplett gelöscht werden und trotzdem soll eine Liste NEU mit den Daten von BESTAND entstehen (ohne dass die Daten vorher in die Liste NEU kopiert werden)? Stehe ich da etwa auf dem Schlauch?

Gruß

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

Vielen Dank erstmal für die Antwort.

Ich versuche mich besser auszudrücken.

Derzeit importiere ich die Daten aus zwei verschiedenen Listen, welche ich auf einem separaten Arbeitsblatt angebe mit dem direkten Pfad.

Den Inhalt diesen beiden Dateien (BESTAND & NEU) fasse ich in einer neuen Liste zusammen, welche im ersten Arbeitsblatt meiner IMPORT-Datei ausgegeben wird.

Auf diese Liste wende ich die genannte Dublettenbereinigung an. Und eben aus dieser zusammengefassten Liste sollen die Daten aus der externen Datei BESTAND wieder abgezogen werden.

LG
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

also wenn ich dich richtig verstehe ist der Sinn der ganzen Sache einfach nur aus der Liste NEU die bereits vorhanden Datensätze, die auch in der Liste BESTAND vorhanden sind, zu löschen, so dass nur die neuen, noch nicht vorhandene Kontakte übrig bleiben?

Kannst du vielleicht mal eine Beispieldatei zur Verfügung stellen, aus der der Aufbau der Datensätze hervorgeht? Du kannst eine Datei mit ein paar Dummydaten z.B. hier hochladen und den Link dann posten.

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Also es soll eine Telefonliste daraus erstellt werden... wir haben eine Datei BESTANDSKUNDEN und eine Datei NEUE DATEN. Diese werden beide in einer neuen Liste zusammengefasst (DUBLETTENBEREINIGUNG - Arbeitsblatt "Daten-Import).

Welche Dateien für den Import vorgesehen sind, lege ich in der Datei DUBLETTENBEREINIGUNG - Arbeitsblatt 2 "Datei-Liste fest.

Derzeit werden aber nur doppelte Einträge bzw. ähnliche Einträge gelöscht (nämlich wenn drei der vier folgenden Kriterien übereinstimmt: Name, Vorname, PLZ, Telefon).

Bis hierhin funktioniert alles.

Jetzt will ich aber noch, dass die ursprünglichen Daten aus der Datei BESTANDSDATEN ebenfalls gelöscht werden. Denn ich will ja eine Liste mit neuen Kontaktdaten, daher müssen die BESTANDSDATEN wieder raus. An der Stelle hakt es :))

Um das Beispiel zum Laufen zu bringen, müssen die folgenden 3 Dateien in einem Ordner

C:\Adressen\

gespeichert werden.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

um die Adressen aus der gemischten Datei zu löschen, müsstest du alle Adressen mit der Liste aus Bestand vergleichen und die gefundenen Übereinstimmungen löschen. Also im Prinzip vergleichst du zweimal die Listen.

Ich würde das Makro völlig neu schreiben:
- Import der Adressen aus NEUE DATEN in die Datei DUBLETTENBEREINIGUNG
- Öffnen der Datei BESTANDSKUNDEN
- Vergleichen der Daten aus DUBLETTENBEREINIGUNG mit BESTANDSKUNDEN und Dubletten gemäß den Vorgaben in DUBLETTENBEREINIGUNG löschen
Fertig.

Damit werden keine Daten vermischt und in der Datei DUBLETTENBEREINIGUNG verbleiben nur die neuen Datensätze.

Und wenn du uns mitteilst, wie deine Dateien aufgebaut sind oder gar eine Beispieldatei mit ein paar Dummy-Daten zur Verfügung stellst (siehe meine Antwort 4) dann gibt es hier im Forum sicher einige Helfer, die dir unter die Arme greifen können :-).

Gruß

M.O.
0 Punkte
Beantwortet von berliner85 Einsteiger_in (43 Punkte)
Âch Mensch, ich hab wohl vergessen, den Link zu meinen Dateien zu schicken.

Also ich bin selbst noch ziemlicher Anfänger, daher bitte ich um Hilfe.

Alles neu schreiben wäre zu viel, ich denke, auch nicht nötig. Dann muss ich eben die Listen zwei Mal vergleichen. Vielleicht kannst Du mir nach Einsicht meiner Beispieldateien helfen.

Hier sind meine Musterdateien, damit alles funktioniert, müssen sie in den Ordner

C:\Adressen\

kopiert werden.

Hier die Links:

BESTANDSKUNDEN.xls
DUBLETTENBEREINIGUNG.xlsm
NEUE-ADRESSEN.xls
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

ich habe mal die Makros etwas geändert: Dublettenbereinigung neu

Schau mal, ob das so funktioniert, wie du willst.

Gruß

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

leider rattert er zwar eine ganze Weile vor sich hin, aber löscht keine doppelten Datensätze.

Wenn ich das richtig verstehe, ist Dein Ansatz der, dass Du nur die Daten aus NEUE ADRESSEN in das Arbeitsblatt importierst und dann im zweiten Stepp durch das neue Makro die BESTANDSDATEN im Hintergrund öffnest und abgleichst. Richtig?

Finde ich nicht so verkehrt, schade ist dann aber nur, dass der Pfad bzw Name nicht mehr ohne Codezugriff geändert werden kann.

Aber würde die Lösung funktionieren, wäre das verkraftbar.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

die Funktionsweise hast du richtig erkannt.

Bei deinen zur Verfügung gestellten Testdateien funktioniert das Makro einwandfrei.
Warum es bei den Echtdateien nicht funktioniert, kann ich so natürlich nicht sagen.
.
Hier noch mal eine geänderte Version, bei der Pfad und Namen per Tabellenblatt festgelegt werden.
Dublettenbereinigung neu2

Gruß

M.O.
...