Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
932to936
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
932to936
932to936
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Duplikate aus aus Tabelle entfernen
13.12.2007 09:12:00
Florian
Hallo,
Folgendes Problem:
Ich ziehe aus einem Worksheet Daten in eine Listbox (ca 100 Spalten und max 500 Zeilen).
Das rausziehen funktioniert folgendermassen:
A B C
7 1
8 1
5
3 1 1
6 1
In Spalte A steht eine einmalige Seriennummer (Primaerschluessel). Gesucht wird in den Spalten B und C.
Falls die jeweilige Zelle "" ist, dann wird der komplette Datensatz ausgelesen und auf ein Worksheet zwischengespeichert und dann in die ListBox geschrieben. Nach obigen Beispiel sieht man also Datensatz 7, 8, 3, 3 und 6 in der Listbox.
Nun moechte ich, dass schon beim Einlesen Duplikate vermieden werden, oder nach Betaetigen eines Buttons die Duplikate loeschen. Ich habe dazu eine Methode verwendet. Es funktioniert auch alles, Problem ist nur, dass ich immer den letzten Datensatz geloescht bekomme, ob Duplikate vorhanden sind oder nicht. Also auch in obigem Beispiel wuerden nur noch die Datensaetze 7,8 und 3 angezeigt werden.
Hier die Methode:
Sub DoppelteLoeschen()
Call Loeschen
End Sub


Sub Loeschen()
Dim Suchen As Integer
Dim Weiter As Integer
Dim EndFind As Integer
Dim i As Integer
Range("A1").Select
EndFind = ActiveSheet.Cells(65536, 1).End(xlUp).Row
For i = 1 To EndFind
Daten = Cells(i, 1).Value
For Each d In Range(Cells(i + 1, 1), Cells(EndFind, 1))
If Daten = d Then
Zelle = d.Row
Rows(Zelle & ":" & Zelle).Select
Selection.Delete Shift:=xlUp
EndFind = EndFind + 1
End If
If EndFind Next d
Next i
End Sub



Private Sub CheckBox3_Click()
Call ZeilenMitDublikatenLoeschen
End Sub


Sub ZeilenMitDublikatenLoeschen()
Dim Zelle As Range, i As Integer, j As Integer, Loeschstr As String
Zeit = Timer
Set DicOriginal = CreateObject("scripting.dictionary")
i = Range("A65536").End(xlUp).Row
Call EventsOff
For j = i To 2 Step -1
If DicOriginal.Exists(Cells(j, 1).Value) = False Then
DicOriginal.Add Cells(j, 1).Value, Cells(j, 1).Address(0, 0)
Else
Loeschstr = Loeschstr & Cells(j, 1).Row & ":" & Cells(j, 1).Row & ","
If Len(Loeschstr) > 244 Then
Loeschstr = Left(Loeschstr, Len(Loeschstr) - 1)
Range(Loeschstr).Delete
Loeschstr = ""
End If
End If
Next j
If Len(Loeschstr) > 0 Then
Loeschstr = Left(Loeschstr, Len(Loeschstr) - 1)
Range(Loeschstr).Delete
End If
Debug.Print Round(Timer - Zeit, 1) & " Sekunden"
Call EventsOn
End Sub



Public Sub EventsOff()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
End Sub



Public Sub EventsOn()
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub


Ich hoffe ihr koennt mir helfen!!!
Vielen Dank

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Duplikate aus aus Tabelle entfernen
13.12.2007 10:22:06
fcs
Hallo Florian,
Duplikate bei Übereinstimmung in 2 Spalten kann man wie folgt entfernen.
Diese Methode ist möglicherweise nicht die allerschnellste, aber sie funktioniert.
Bei ca. 500 Zeilen dürfte das aber nicht eine so große Rolle spielen.
ggf. muss du noch die Zeilen zum Ein-/Ausschalten der Event-Überwachung aktivieren.
Gruß
Franz

Sub DuplikateEntfernen()
'Zeilen löschen bei Übereinstimmung in Zeilen B und C oder wenn beide Spalten leer
Dim Zeile1 As Long, wks As Worksheet, Zeile2 As Long
Application.Calculation = xlCalculationManual
'  Application.EnableEvents = False
Application.ScreenUpdating = False
Set wks = ActiveSheet
With wks
For Zeile1 = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
For Zeile2 = 1 To Zeile1 - 1
If (.Cells(Zeile1, 2).Value = .Cells(Zeile2, 2) And _
.Cells(Zeile1, 3).Value = .Cells(Zeile2, 3)) Or _
(.Cells(Zeile2, 2).Value = "" And .Cells(Zeile2, 3).Value = "") Then
.Rows(Zeile2).Delete shift:=xlShiftUp
End If
Next
Next
End With
Application.Calculation = xlCalculationAutomatic
'  Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub


Anzeige
AW: Duplikate aus aus Tabelle entfernen
14.12.2007 03:04:19
Florian
Hallo Franz,
danke das Du Dich meiner annimmst.
Ich glaube ich habe das Problem ein wenig zu einfach beschrieben. Hier nochmal:
Ich habe ca. 200 Datensaetze, die eindeutig identifizierbar sind ueber einen Primaerschluessel (Vertragsnummer). Dieser Schluessel steht in Spalte A.
Nun moechte ich Datensaetze, die in den Spalten B bis M Daten enthalten, also "" (ungleich 0) sind, in eine ListBox schreiben. Dies funktioniert auch.
Allerdings habe ich das Problem, dass wenn ein Datensatz in mehreren Spalten Werte enthaelt, wird dieser auch mehrfach ausgelesen.
Um die angezeigten Duplikate zu loeschen, habe ich die schon genannte Methode verwendet. Allerding loescht diese Methode aus irgendwelchen Gruenden immer die letzte Zeile, ob es Duplikate gibt oder nicht.
Ich weiss nicht warum und brauche dringend eine Loesung.
Ich selber bin eher noch im Anfaegerstatus und komm nicht weiter.
Vielen Dank
Flo

Anzeige
AW: Duplikate aus aus Tabelle entfernen
15.12.2007 11:03:41
fcs
Hallo Florian,
beim Löschen von Tabellenzeilen per Makro sollte man immer am Ende (Unten) beginnen, da sonst die Schleifenzähler nicht korrekt arbeiten.
Modifiziere deine Loeschen-Prozedur wie folgt, um die doppelten Einträge zu entfernen.
Gruß
Franz

Sub Loeschen()
Dim EndFind As Integer
Dim Zeile As Integer, Zelle As Range
Range("A1").Select
EndFind = ActiveSheet.Cells(65536, 1).End(xlUp).Row
Application.ScreenUpdating = False
For Zeile = EndFind To 2 Step -1
For Each Zelle In Range(Cells(1, 1), Cells(Zeile - 1, 1))
If Cells(Zeile, 1).Value = Zelle.Value Then
Rows(Zeile).Delete Shift:=xlUp
End If
Next Zelle
Next Zeile
Application.ScreenUpdating = False
End Sub


Anzeige

58 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige