Anzeige
Archiv - Navigation
968to972
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
968to972
968to972
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA morko doppelte Zeileneinträge löschen

VBA morko doppelte Zeileneinträge löschen
20.04.2008 01:10:12
Bernhard
Hallo
ich führe zusammen mit Anderen eine Mitgliederliste. Mehrfach hatten wir festgestellt, dass doppelte Einträge gemacht wurden - also Name (A8), Vorname (C8) und Adresse (F8) sind identisch.
Jetzt suche ich einem Möglichkeit über ein Makro diese Doppeleinträge zu löschen.
Spezialfilter geht nicht, da ich die Daten später über ein Makro auslesen lassen will.
Vielleicht hat jemand einen brauchbaren Vorschlag.

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 02:41:51
Daniel
HI
Doppelte Löschen wird hier öfters mal nachgefragt.
die schnellste Mehtode ist diese hier:
Die Tabelle wird nach Namen, Vornamen und Addresse sortiert, um das Auffinden der doppelten zu vereinfachen, aber das sollte in einer Namensliste kein Problem sein.

Sub Doppelte_Löschen()
Dim Ze1 As Long, Ze2 As Long
Ze1 = 8
Ze2 = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(Ze1, 1), Cells(Ze2, 1)).EntireRow
.Sort key1:=Cells(8, "A"), order1:=xlAscending, _
key2:=Cells(8, "C"), order2:=xlAscending, _
key3:=Cells(8, "F"), order3:=xlAscending, header:=xlNo
End With
Columns(1).Insert
With Range(Cells(Ze1, 1), Cells(Ze2, 1))
.FormulaR1C1 = "=IF(AND(RC[1]=R[-1]C[1],RC[3]=R[-1]C[3],RC[6]=R[-1]C[6]),TRUE,ROW())"
.Formula = .Value
.EntireRow.Sort key1:=.Cells(1, 1), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
Columns(1).Delete
End Sub


Achtung, nicht getestet, da keine brauchbare Beispieldatei vorhanden ist.
Gruß, Daniel

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 09:49:25
Bernhard
Hallo,
nett daß Du mir so schnell geantwortet hast. Aber leider funktioniert das Makro - auch wenn ich es umschreibe nicht.
Deshalb anbei den Tabelleninhalt (Muster) als Text.
-----------------------------------------
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
hier stehen noch andere Daten die nicht verändert werden sollen;;;;;;;;;
Gruppe#;Familienname#;Akademischer Grad#;Vorname(n)#;Geburtsdatum#;Familienstand#;Telefon#;Beruf#;Anschrift#;Übungsleiter#
LG;Armadi;;Guido;;;;;52249 Kranken Albin-K?Isstrasse 12;
TW;Ronaldo;;Stefanie;;;;;76348 Rauchbronn Ulmenweg 3;
TT;Armadi;;Ester;;;;;52249 Kranken Albin-K?Isstrasse 12;
FB;Grauer;;Manjola;;;;;76530 Baden-Baden Oostalstrasse 11;
TW;Lekitic;;Josefine;;;;;74074 Heimsheim Friedrich-Dengler-Strasse 55;
LG;Armadi;;Guido;;;;;52249 Kranken Albin-K?Isstrasse 12;
----------------------------------------------
Die ersten 6 Zeilen der Tabelle können nicht verändert werden.
Vielleicht hat jemand eine Idee wie ich die Doppelte Zeile löschen kann. Mit einer Formel in meiner Tabelle kann ich nichts anfangen.
Bernhard

Anzeige
besser eine Beispieltabelle
20.04.2008 10:09:50
Tino
Hallo,
mit deiner Darstellung einer Tabelle kann ich nicht viel anfangen,
kannst Du auch eine Beispiel Tabelle laden?
Gruß
Tino

AW: besser eine Beispieltabelle
20.04.2008 10:28:07
Bernhard
Hallo Tino,
bin neu im Forum und habe keine Ahnung wie ich die Datei hochladen soll.
Wenn du aber "meine Daten" in Word kopierst, als *.txt speicherst, kannst Du sie in Excel einlesen.
Gruß Bernhard

AW: besser eine Beispieltabelle
20.04.2008 11:37:00
Tino
Hallo,
habe hier mal den Spezialfilter versendet,
unter zur Hilfenahme einer zweiten Tabelle, diese wird zum Schluss wieder gelöscht.

Sub Löschedoppelt()
Dim SuchBer As Range, SuchAddress As String
Dim Tabel As Worksheet, Tabelneu As Worksheet
Application.ScreenUpdating = False
Set Tabel = ActiveSheet
With Tabel
Set SuchBer = _
.Range(.Cells(6, 1), .Cells(Rows.Count, 1).End(xlUp).Offset(0, Columns.Count - 1))
End With
SuchAddress = SuchBer.Address
Set Tabelneu = Sheets.Add
SuchBer.AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=Tabelneu.Range("A7"), Unique:=True
SuchBer.ClearContents
Tabelneu.Range(SuchAddress).Copy Tabel.Range(SuchAddress)
With Application
.DisplayAlerts = False
Tabelneu.Delete
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set Tabel = Nothing
Set Tabelneu = Nothing
Set SuchBer = Nothing
End Sub


Rückmeldung wäre nicht schlecht.
Gruß
Tino

Anzeige
noch ein Fehler, sorry
20.04.2008 11:56:05
Tino
Hallo,
noch ein fehler gefunden.
Mach aus
SuchBer.AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=Tabelneu.Range("A7"), Unique:=True
diese
SuchBer.AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=Tabelneu.Range("A6"), Unique:=True
Sonst hast du zwei überschrifeten.
Gruß
Tino

Datei hochladen.
20.04.2008 12:06:00
Tino
Hallo,
über den Link
"Hier geht es zum File-Upload"
https://www.herber.de/forum/file_upload.html
kannst du dir eine Datei hoch laden.
Nach dem hoch laden kommt ein Fenster mit einem Link darin,
diesen komplett in deinen Beitrag reinkopieren.
Gruß
Tino

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 10:28:31
ransi
HAllo Bernhard
Wenn du in dem relevanten Bereich keine Formeln hast, versuch mal dies:
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub test()
Dim b As Range 'Der interessante Bereich
Dim Dic 'Dictionary
Dim L 'Zeilenzähler
Dim I 'Dir Items des Dictionarys
Dim J As String 'Verkettung der jeweiligen Einträge
Set Dic = CreateObject("Scripting.dictionary")
Set b = Intersect(Range("A1").CurrentRegion, Range("A7:J65536"))
For L = 1 To b.Rows.Count
    J = Join(Array(b(L, 2), b(L, 4), b(L, 9)), "###")
    Dic(J) = b.Rows(L)
Next
I = Dic.items
'Bereich löschen
b.ClearContents
'Unikate eintragen
For L = 1 To Dic.Count
    b.Rows(L) = I(L - 1)
Next
End Sub

ransi

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 10:52:37
Bernhard
Hallo Ransi,
damit komme ich nicht klar. Wenn ich das Makro in meiner Tabelle - diese fängt bei A8 - U 8 an -
laufen lasse, wir das meiste gelöscht.
Hinter die Logik bin ich nicht gestiegen.
Sorry.
Bernhard

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 11:16:34
Gerd
Hallo Bernhard,
zweimal "ich auch (noch) nicht!". :-)
mit Formeln außerhalb von Worksheetfunction, den Code von Ransi muss ich erst noch verstehen.
Bis dahin:

Sub testA()
Dim vntSpalten()
Dim lngZeile As Long, intZähler As Integer, x As Long
vntSpalten = Array("B", "D", "I")                                 'Prüfspalten ggf. anpassen !!
For lngZeile = Cells(Rows.Count, 1).End(xlUp).Row To 8 Step -1
x = 1
For intZähler = LBound(vntSpalten) To UBound(vntSpalten)
x = x * Application.WorksheetFunction.CountIf _
(Range(Cells(7, vntSpalten(intZähler)), _
Cells(lngZeile - 1, vntSpalten(intZähler))), _
Cells(lngZeile, vntSpalten(intZähler)))
Next
If x > 0 Then Rows(lngZeile).Delete
Next
End Sub


Gruß Gerd

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 11:25:47
ransi
Hallo Bernhard
Der Code ist auf deine Beispieltabelle abgestimmt.
Da ist der relevante Bereich nunmal A8:J13
Die Nachnamen stehen in Spalte 2,
Die Vornamen in Spalte 4
Die Adressen in Spalte 9
Hier werden die Werte verkettet.
J = Join(Array(b(L, 2), b(L, 4), b(L, 9)), "###")
Ist diese Verkettung noch nicht im Dictionary aufgenommen, wird sie es dann.
Das Zugehörige Item zu der Verkettung ist dann die Ganze Zeile.
Dic(J) = b.Rows(L)
Zum Schluss wird der relevante Bereich gelöscht und die Unikate einzeln wieder reingeschrieben.
Schau dir mal die Beispieltabelle an.
https://www.herber.de/bbs/user/51715.xls
ransi

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
21.04.2008 17:36:00
Bernhard
Hallo Ransi,
ich habe Dein Makro meiner Tabelle angepaßt und nach dem Filtern / lösche und Doppelten
dieses Makro drüber laufen lassen.
Die Tabelle ist anscheinend immer noch gleich groß, obwohl eine Zeile gelöscht wurde.
Wenn ich die Daten in ein anderes Programm einlesen will - meckert dieses, da eine leere Zeile dort nicht
importiert werden kann.
Also habe ich jetzt ein neues Problem.
Anbei mein Überprüfungstool:

Sub Groessentest()
'Test, wie groß der Datenbereich ist und wandelt GROSS in Gross um
XYTab = ActiveWorkbook.Name
ActiveCell.SpecialCells(xlLastCell).Select
y = ActiveCell.Row
z = ActiveCell.Column
Dim n As Variant
For n = 1 To y
Cells(n, 1).Activate
Name = ActiveCell.Value
If ActiveCell  "" Then
Cells(n, 1) = Application.WorksheetFunction.Proper(Cells(n, 1))
End If
Next n
End Sub


Vielleicht hast Du oder Gerd noch eine Idee, wie ich die vermeintlich leere Zeile wegbekomme.
PS: Wenn ich die Datei nach dem Lösche speichere und wieder öffne, wird bei meinem Tool
die Größe richtig angezeigt.
Bernhard

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
21.04.2008 19:07:00
ransi
Hallo Bernhard
Versuch mal ohne Select auszukommen:
Option Explicit

Sub Groessentest()
Dim Y As Long
Dim N As Long
For N = 1 To Range("A65536").End(xlUp).Row
    Cells(N, 1) = Application.WorksheetFunction.Proper(Cells(N, 1))
Next N
End Sub

ransi

Anzeige
AW: VBA morko doppelte Zeileneinträge löschen
21.04.2008 21:56:00
Bernhard
Hallo Ransi,
sorry, nur die ersten Werte (y u. z) des Makros benutze ich, um mir anzeigen zu lassen, wie groß der Bereich ist.

Sub Groessentest()
'Test, wie groß der Datenbereich ist und wandelt GROSS in Gross um
XYTab = ActiveWorkbook.Name
ActiveCell.SpecialCells(xlLastCell).Select
Y = ActiveCell.Row
z = ActiveCell.Column
'was folgt stellt nur um auf Gross/Kleinschreibung (war halt noch drin)
Dim N As Variant
For N = 1 To Y
Cells(N, 1).Activate
Name = ActiveCell.Value
If ActiveCell  "" Then
Cells(N, 1) = Application.WorksheetFunction.Proper(Cells(N, 1))
End If
Next N
End Sub


Damit hatte ich auch das zuvor von mir geschilderte Problem festgestellt.
Gruß Bernhard

AW: VBA morko doppelte Zeileneinträge löschen
21.04.2008 23:18:54
Bernhard
Hallo Ransi,
sorry, nur die ersten Werte (y u. z) des Makros benutze ich, um mir anzeigen zu lassen, wie groß der Bereich ist.

Sub Groessentest()
'Test, wie groß der Datenbereich ist und wandelt GROSS in Gross um
XYTab = ActiveWorkbook.Name
ActiveCell.SpecialCells(xlLastCell).Select
Y = ActiveCell.Row
z = ActiveCell.Column
'was folgt stellt nur um auf Gross/Kleinschreibung (war halt noch drin)
Dim N As Variant
For N = 1 To Y
Cells(N, 1).Activate
Name = ActiveCell.Value
If ActiveCell  "" Then
Cells(N, 1) = Application.WorksheetFunction.Proper(Cells(N, 1))
End If
Next N
End Sub


Damit hatte ich auch das zuvor von mir geschilderte Problem festgestellt.
Gruß Bernhard

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 11:39:36
Bernhard
Hallo Gerd,
auch das funktioniert nicht.
die Prüfspalten habe ich angepaßt. Das Makro löscht nicht die Doppelten Zeilen unterhalb der ersten Zeile
A8 sondern nach oben - also wird die Überschriftzeile gelöscht.
Offensichtlich bin ich zu dusselig, das Makro entsprechend anzupassen.
Bernhard

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 11:42:54
ransi
Hallo Bernhard
Gibt diese Box :
MsgBox "Relevanter Bereich:= " & b.Address
denn den richtigen Bereich aus ?
ransi

oops, Gerd war ja gemeint. owt
20.04.2008 11:44:00
ransi

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 12:13:18
Bernhard
Hallo Ransi, hallo Gerd
jetzt funktioniert das Ganze. Ich habe auch begriffen.
Vielen Dank

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 12:02:00
Gerd
Hallo Bernhard,
stelle der Einfachheit halber das angepasste Makro hier rein.
Beschreibe bitte noch, ab welcher Zeile nach unten Einträge stehen u. in welchen Spalten
auf doppelte Einträge geprüft werden soll.
P.S.: In den Prüfspalten sollten dazwischen keine leeren Zellen sein.
Ansonsten müsste noch nachgebessert werden.
Geprüft wird, ob die kompletten Zelleninhalte, also alle Zeichen mit Position übereinstimmen.
Als "Meßlatte" zur Ermittlung der letzten Zeile mit Inhalt habe ich die Spalte "A" bzw.
Spaltennummer "1" genommen.
Hast Du den Code von Ransi ausprobiert?
Gruß Gerd

AW: VBA morko doppelte Zeileneinträge löschen
20.04.2008 12:27:18
Daniel
Hallo Berndhard
das Problem ist, daß leider deine Dateibeschreibung aus dem ersten Posting nicht mit dem von dir hochgeladenen Beispieltext übereinstimmt:
Name: Beschreibung: Spalte A Beispieltext: Spalte B
Vorname: Beschreibung: Spalte C Beispieltext: Spalte D
Addresse: Beschreibunb: Spalte F Beispieltext: Spalte I
ich habe natürlich das Makro entsprechend deiner Beschreibung geschrieben und wenn du nicht in der Lage bist, die Spalten korrekt wiederzugeben , dann ist das dein Problem.
wennd du das Makro selbst nicht ändern kannst, dann pass doch einfach deine Tabelle so an, daß sie deiner Beschreibung entspricht. Dann funktioniert mein Makro wunderbar:
https://www.herber.de/bbs/user/51717.xls
Gruß, Daniel

AW: @ Ransi
20.04.2008 14:08:00
Gerd
Hallo Ransi,
der Bereich stimmte im von Bernhard vorgegebenen Kontext.
Dass die Überschriften mit verarbeitet werden, stört nicht weiter, weil dies einmalige Werte sind.
Bei der Festlegung eines Range habe ich andere Präferenzen. Dies ist aber lediglich eine Stilfrage.
Mein Fragezeichen war, nachzuvollziehen wie die Duplikate verschwinden.
Die Werte werden zu Strings zu verkettet u. diese als Keys des Dictionary-Objekts verwendet.
Die Items des Dictionary mit bereits vorhandenen Keys werden so einfach überschrieben.
Eine astreine u. natürlich sehr schnelle Lösung!
Respekt u. vielen Dank!
Gruß Gerd

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige