Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
976to980
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
976to980
976to980
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

doppelt in Spalte I löschen

doppelt in Spalte I löschen
20.05.2008 10:32:59
Wolfgang
Hallo,
ich würde gerne im aktiven Tabellenblatt überprüfen lassen, ob sich darin doppelte Daten befinden, um dann den jeweils doppelt oder evtl. auch sogar dreifach vorkommenden Datensatz (Zeile) zu löschen. Bezugsspalte ist die Spalte I. Mit dem Makrorekorder bekomme ich das nicht hin. Wäre dankbar für entsprechende Hilfestellungen.
Herzliche Grüße
Wolfgang

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: doppelt in Spalte I löschen
20.05.2008 10:39:31
Hajo_Zi
Hallo Wolfgang,
ohne Makro
Doppelte Löschen
angenommen Deine Daten stehen in A1 bis A?
Bereich markieren = Spalte A anklicken (evtl. eine Leerzeile vorher einfügen)
Daten / Filter / Spezialfilter
keine Duplikate
jetzt kannst du noch einstellen, ob an gleicher Stelle oder woanders placiert; hier also B1 eingeben
Spalte A anschließend löschen
Bei mehreren Spalten, muss die Liste eine Überschrift haben, am besten fett formatiert, dann erkennt sie auch Excel als Überschrift.

AW: doppelt in Spalte I löschen
20.05.2008 11:50:00
Daniel
Hallo
zum Löschen von Doppelten Datensätzen ist dieses Makro geeignet:

Sub Mehrfacheinträge_löschen()
Columns(1).Insert
With Cells(1, 1).Resize(Cells(65536, 2).End(xlUp).Row, 1)
.FormulaLocal = "=wenn(zählenwenn($J$1:$J1;J1)>1;wahr;zeile())"
.Formula = .Value
.EntireRow.Sort key1:=Cells(1, 1), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
Columns(1).Delete
End Sub


der Zellbezug im Makro ist J und nicht I, weil ein Spalte A ne Hilfsspalte eingfügt wird.
Gruß, Daniel

Anzeige
AW: doppelt in Spalte I löschen
20.05.2008 14:08:00
Chris
Servus,
der Code von Daniel its wegen des Zählenwenns in der Formel recht langsam bei großen Datenmengen (Neuberechnung jeder Zelle durch Zählenwenn). Wenn die daten sortiert sind kann man statt mit Zählenwenn nur mit wenn arbeiten, dies ist dann auch sehr schnell, aber für unsortierte Datenreihen ist die Zählenwenn-formel nicht geeignet:
Für unsortierte datenreihen, habe ich mal folgende Codes (schon angepasst für Spalte I) entwickelt:
Option Explicit
Option Base 1
Dim ArrInhalt() As Variant, ArrZeile() As Long, ArrZeileNeu() As Long, ArrInhaltNeu() As Variant

Sub doppelte()
Dim lngletzte As Long, z As Long, x As Long, o As Long, p As Long
'Call Zeit_starten
lngletzte = IIf(IsEmpty(Cells(Rows.Count, 9)), Cells(Rows.Count, 9).End(xlUp).Row, Rows.Count) ' _
letzte beschriebene In Spalte I
ReDim ArrInhalt(1 To lngletzte)
ReDim ArrZeile(1 To lngletzte)
For z = LBound(ArrInhalt()) To UBound(ArrInhalt()) ' Inhalt Spalte I in Array
ArrInhalt(z) = Cells(z, 9)
ArrZeile(z) = Cells(z, 1).Row
Next z
Dim OG&, i&, j&, k&, h, y As Variant ' Inhalt sortieren
OG = UBound(ArrInhalt())
k = OG \ 2
While k > 0
For i = LBound(ArrInhalt()) To OG - k
j = i
While (j >= 0) And (ArrInhalt(j) > ArrInhalt(j + k))
h = ArrInhalt(j)
y = ArrZeile(j)
ArrInhalt(j) = ArrInhalt(j + k)
ArrZeile(j) = ArrZeile(j + k)
ArrInhalt(j + k) = h
ArrZeile(j + k) = y
If j > k Then
j = j - k
Else
j = LBound(ArrInhalt())
End If
Wend
Next i
k = k \ 2
Wend
Dim element1 As Long
For z = UBound(ArrInhalt()) To LBound(ArrInhalt()) + 1 Step -1 ' sortierten Inhalt nach Zeilen  _
ordnen
If ArrInhalt(z) = ArrInhalt(z - 1) Then
If ArrZeile(z)  0
For i = LBound(ArrZeile()) To OG - k
j = i
While (j >= 0) And (ArrZeile(j) > ArrZeile(j + k))
h = ArrZeile(j)
y = ArrInhalt(j)
ArrZeile(j) = ArrZeile(j + k)
ArrInhalt(j) = ArrInhalt(j + k)
ArrZeile(j + k) = h
ArrInhalt(j + k) = y
If j > k Then
j = j - k
Else
j = LBound(ArrZeile())
End If
Wend
Next i
k = k \ 2
Wend
x = 1
ReDim ArrZeileNeu(1)
ReDim ArrInhaltNeu(1)
For z = LBound(ArrZeile()) To UBound(ArrZeile()) ' null gesetzte Zeilen aussortieren
If ArrZeile(z)  0 Then
ReDim Preserve ArrZeileNeu(x)
ReDim Preserve ArrInhaltNeu(x)
ArrZeileNeu(x) = ArrZeile(z)
ArrInhaltNeu(x) = ArrInhalt(z)
x = x + 1
End If
Next z
OG = UBound(ArrZeileNeu()) ' zur Sicherheit nochmal neu sortieren
k = OG \ 2
While k > 0
For i = LBound(ArrZeileNeu()) To OG - k
j = i
While (j >= 0) And (ArrZeileNeu(j) > ArrZeileNeu(j + k))
h = ArrZeileNeu(j)
y = ArrInhaltNeu(j)
ArrZeileNeu(j) = ArrZeileNeu(j + k)
ArrInhaltNeu(j) = ArrInhaltNeu(j + k)
ArrZeileNeu(j + k) = h
ArrInhaltNeu(j + k) = y
If j > k Then
j = j - k
Else
j = LBound(ArrZeileNeu())
End If
Wend
Next i
k = k \ 2
Wend
For z = LBound(ArrZeileNeu()) To UBound(ArrZeileNeu()) ' übrige Zeilen nach oben kopieren
Cells(ArrZeileNeu(z), 9).Copy Range("I" & z)
Next z
If lngletzte >= UBound(ArrZeileNeu()) + 1 Then ' überschÜssige Inhalte leeren und Zeilen lö _
schen
Range("I" & UBound(ArrZeileNeu()) + 1 & ":I" & lngletzte).ClearContents
If lngletzte = UBound(ArrZeileNeu()) + 1 Then
Range("I" & lngletzte).EntireRow.Delete
Else
Range("I" & UBound(ArrZeileNeu()) + 1 & ":I" & lngletzte).SpecialCells(xlCellTypeBlanks). _
EntireRow.Delete
End If
End If
'Call Zeit_stoppen
End Sub



Sub schreib()
Dim z As Long, o As Long
For z = LBound(ArrInhaltNeu(), 1) To UBound(ArrInhaltNeu(), 1)
For o = LBound(ArrInhaltNeu(), 2) To UBound(ArrInhaltNeu(), 2)
Cells(z + 8, o) = ArrInhaltNeu(z, o)
Next o
Next z
'Call Zeit_stoppen
End Sub


Gruß
Chris

Anzeige
AW: doppelt in Spalte I löschen
20.05.2008 15:29:00
Daniel
Hi
das stimmt, ZählenWenn bremst natürlich.
wenn die alte Reihenfolge erhaltenbleiben soll, dann kann man aber einfach auch in einer weiteren Hilfspalte diese sichern.
Dann können die Daten so umsortiert werden, daß man die schnelle WENN-Funktion verwenden kann.
Beim Rücksortieren greift man dann auf die gesicherte Reihenfolge zurück, so daß die nicht gelöschten Daten wieder in der Ursprünglichen Reihenfolge stehen:

Sub Mehrfacheinträge_löschen()
Dim Zeile As Long
Zeile = Cells(Rows.Count, "I").End(xlUp).Row
Range("A:B").Insert
With Cells(2, 1).Resize(Zeile - 1, 1)
'--- alte Reihenfolge sichern
.FormulaLocal = "=Zeile()"
.Formula = .Value
'--- Umsortieren für WENN-Funktion
.EntireRow.Sort key1:=Cells(1, "K"), order1:=xlAscending, Header:=xlNo
End With
With Cells(2, 2).Resize(Zeile - 1, 1)
.FormulaLocal = "=wenn(K1=K2;wahr;A2)" '--- In Spalte A ist alte Reihenfolge gesichert
.Formula = .Value
.EntireRow.Sort key1:=Cells(2, 2), order1:=xlAscending, Header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
Range("A:B").Delete
End Sub


Gruß, Daniel
achso, mein Makro geht davon aus, daß die erste Zeile die Überschriftenzeile ist.

Anzeige
AW: schnell und gut o.w.T.
20.05.2008 15:56:00
Chris
.

Danke, Hajo, Chris und Daniel !
20.05.2008 21:30:33
Wolfgang
Hallo Hajo, Chris und Daniel
zunächst Entschuldigung, dass ich mich jetzt erste melde. Ich war leider den ganzen Tag beruflich unterwegs und hatte zwischendurch leider keine Möglichkeit, ins Forum zu gehen. Herzlichen Dank für Eure Rückmeldung und die Ausarbeitungen. Ich bin leider noch nicht dazu gekommen, die Codes zu testen. Am Donnerstag ist hier Feiertag, dann werde ich mich spätestens ans Werk machen. Sollte ich dann noch Fragen habe, werde ich mich noch einmal melden. Einstweilen erneut recht herzlichen Dank - ich freue mich sehr.
Herzliche Grüße
Wolfgang
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige