Supportnet / Forum / Tabellenkalkulation
Prüfung nach doppelten Einträgen
Frage
Hi Leute!
Ich hab eine Routine geschrieben, die mir in einer Spalte doppelte Werte suchen soll. Leider dauert die Ausführung des nachfolgende Befehlscodes sehr lange.
For k = 1 To 2000
For j = k + 1 To 2000
If Cells(k, 1) = Cells(j, 1) Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
Next j
Next k
Vielleicht wisst Ihr eine schnellere Lösung?
Schonmal danke für Eure Hilfe!
Gruß
Thomas
Antwort 1 von Event
For k = 1 To 2000
For j = k + 1 To 2000 -k
If Cells(k, 1) = Cells(j, 1) Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
Next j
Next k
sollte schon ein bischen was bringen
Sind es wirklich genau 2000 Zeilen, die mit Daten gefüllt sind?
Gruß
For j = k + 1 To 2000 -k
If Cells(k, 1) = Cells(j, 1) Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
Next j
Next k
sollte schon ein bischen was bringen
Sind es wirklich genau 2000 Zeilen, die mit Daten gefüllt sind?
Gruß
Antwort 2 von butzeman1980
nein, es sind nicht immer genau 2000 zeilen, ich habe noch eine if abfrage drin, die die routine abbricht, sobald das letzt feld erreicht wird (if k="" then...) erreicht wird...
Antwort 3 von butzeman1980
sorry, sollte heissen if cells(k,1)="" then...
Antwort 4 von schnallgonz
Tagchen,
ich glaube, die Bremse liegt am dauernden Markieren,
Versuch´ doch mal so:
MfG
schnallgonz
ich glaube, die Bremse liegt am dauernden Markieren,
Versuch´ doch mal so:
If ActiveCell.Offset(1, 0).Value = ActiveCell.Value Then
ActiveCell.Offset(1, 0).EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End IfMfG
schnallgonz
Antwort 5 von butzemann1980
danke für deine hilfe!
hab aber keine ahnung wo ich das einbauen soll...
was bewirkt der befehl activecell.offset?
gruß
thomas
hab aber keine ahnung wo ich das einbauen soll...
was bewirkt der befehl activecell.offset?
gruß
thomas
Antwort 6 von schnallgonz
Hallo Thomas
ActiveCell.Offset(Zeile, Spalte) läßt Dich von der aktiven Zelle auf die Nachbarschaft zugreifen, ohne dass Du dahin mußt,
praktisch ´ne Art Fernsteuerung.
ActiveCell.Offset(1, 0) = Zugriff auf eine Zelle unter der AktivZelle
oder
ActiveCell.Offset(0, 1) = Zugriff auf eine Zelle neben der AktivZelle
´wenn Wert der Zelle unterhalb der AktivZelle = Wert Aktivzelle, dann
´Zeile, in der die Zelle unterhalb Aktivzelle steht, löschen
Else
´Aktivzelle um eine Zelle nach unten legen
End If
Verständlich?
Das Ganze mußt Du noch in Deine Schleife einbinden,
entweder For k = 1 To 2000
oder so lange, bis ActiveCell = leer:
(dann Loop am Schleifenende nicht vergessen)
und den Start festlegen z.B.
MfG
schnallgonz
ActiveCell.Offset(Zeile, Spalte) läßt Dich von der aktiven Zelle auf die Nachbarschaft zugreifen, ohne dass Du dahin mußt,
praktisch ´ne Art Fernsteuerung.
ActiveCell.Offset(1, 0) = Zugriff auf eine Zelle unter der AktivZelle
oder
ActiveCell.Offset(0, 1) = Zugriff auf eine Zelle neben der AktivZelle
´wenn Wert der Zelle unterhalb der AktivZelle = Wert Aktivzelle, dann
If ActiveCell.Offset(1, 0).Value = ActiveCell.Value Then´Zeile, in der die Zelle unterhalb Aktivzelle steht, löschen
ActiveCell.Offset(1, 0).EntireRow.DeleteElse
´Aktivzelle um eine Zelle nach unten legen
ActiveCell.Offset(1, 0).SelectEnd If
Verständlich?
Das Ganze mußt Du noch in Deine Schleife einbinden,
entweder For k = 1 To 2000
oder so lange, bis ActiveCell = leer:
Do Until IsEmpty(ActiveCell)(dann Loop am Schleifenende nicht vergessen)
und den Start festlegen z.B.
Range("A1").SelectMfG
schnallgonz
Antwort 7 von schnallgonz
Hallo nochmal,
hier ein komplettes Listing zum Dublettenkill.
Beginnt mit Abfrage, in welcher Spalte gesucht werden soll.
A1 oder B1 oder ab C5 usw.
Funzt natürlich nur, wenn Daten sortiert sind bis zur ersten leeren Zelle in der gewählten Spalte.
hier ein komplettes Listing zum Dublettenkill.
Beginnt mit Abfrage, in welcher Spalte gesucht werden soll.
A1 oder B1 oder ab C5 usw.
Funzt natürlich nur, wenn Daten sortiert sind bis zur ersten leeren Zelle in der gewählten Spalte.
Sub DublettenKill()
Dim s As String
Dim i As Integer
s = InputBox("In welcher Spalte sollen Dubletten gesucht und gelöscht werden?", _
"Spalteneingabe z.B. A1 oder B3", "A1")
If s = "" Then Exit Sub
Range(s).Select
Do Until IsEmpty(ActiveCell)
If ActiveCell.Offset(1, 0).Value = ActiveCell.Value Then
ActiveCell.Offset(1, 0).EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End SubAntwort 8 von schnallgonz
Nachtrag:
braucht man nicht, habe ich versehentlich reinkopiert.
Gruß
schnallgonz
Dim i As Integer braucht man nicht, habe ich versehentlich reinkopiert.
Gruß
schnallgonz
Antwort 9 von butzemann1980
hi
sorry, dass ich jetzt erst antworte, war das woende unterwegs. klappt alles prima, danke für die hilfe!
gruß
thomas
sorry, dass ich jetzt erst antworte, war das woende unterwegs. klappt alles prima, danke für die hilfe!
gruß
thomas

