Supportnet Computer
Planet of Tech

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ß

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:

If ActiveCell.Offset(1, 0).Value = ActiveCell.Value Then
ActiveCell.Offset(1, 0).EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If


MfG
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

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
If ActiveCell.Offset(1, 0).Value = ActiveCell.Value Then


´Zeile, in der die Zelle unterhalb Aktivzelle steht, löschen
ActiveCell.Offset(1, 0).EntireRow.Delete


Else
´Aktivzelle um eine Zelle nach unten legen
ActiveCell.Offset(1, 0).Select


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:

Do Until IsEmpty(ActiveCell)

(dann Loop am Schleifenende nicht vergessen)

und den Start festlegen z.B.
Range("A1").Select


MfG
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.

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 Sub


Antwort 8 von schnallgonz

Nachtrag:

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

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: