Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Doppelte Einträge löschen

Doppelte Einträge löschen
Horst
Hallo Excel-Gemeinde,
Ein Tabellenblatt enthält in Spalte "AS" mehrere idente Datumswerte (siehe Bsp.), von denen nur jeweils der letzte Eintrag in der Tabelle stehen bleiben sollte, alle anderen Zeilen des gleichen Datums und der gleichen Uhrzeit sollen gelöscht werden.
Wie könnte ein Makro aussehen, dass dies von einer externen .xls aus durchführt? Hinweis: Die zu verändernde Arbeitsmappe selbst darf kein Makro enthalten, da sie von einem externen Programm generiert und minütlich überschrieben wird.
Beispiel: (nur der letzte Eintrag sollte in der Tabelle verbleiben)
-0.771063465 30.05.2011 14:31
0.818491805 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.793459851 30.05.2011 14:31
0.775668144 30.05.2011 14:31
0.761440037 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.755893882 30.05.2011 14:31
0.747724501 30.05.2011 14:31
0.747724501 30.05.2011 14:31
0.747724501 30.05.2011 14:31
0.695135396 30.05.2011 14:31
0.695135396 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
0.690510149 30.05.2011 14:31
Besten Dank für Eure Hilfe!
Horst

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Nachfrage
30.05.2011 16:39:40
Matthias
Hallo
Stehen die Werte, Datum und Uhrzeit in einer einzigen Zelle, oder stehen die Daten in 3 Spalten?
was meinst Du damit:
erst schreibst Du ... von denen nur jeweils der letzte Eintrag in der Tabelle stehen bleiben sollte
und dann schreibst Du ... Beispiel: (nur der letzte Eintrag sollte in der Tabelle verbleiben)
Ich bin also nicht sicher welche Daten Du nun wirklich behalten willst
Desweiteren verstehe ich das nicht ganz:
da sie von einem externen Programm generiert und minütlich überschrieben wird
Warum willst Du denn erst löschen, wenn die Daten sowieso überschrieben werden?
Ich hab das jetzt erstmal so umgesetzt (ohne zu löschen, einfach nur markieren)
Der Code bezieht sich auf den dargestellten Tabellenbereich Option Explicit Sub loeschen() Dim x& For x = 36 To 2 Step -1 If Cells(x, 1) = Cells(x - 1, 1) And Cells(x, 2) = Cells(x - 1, 2) And Cells(x, 3) = Cells(x - _ 1, 3) Then Cells(x - 1, 4) = "diese Zeile löschen ?" Else Cells(x - 1, 4) = "Daten behalten !" End If Next End Sub
Du kannst ja mal schauen ob es die Zeilen sind, die gelöscht werden sollen.
 ABCD
1-0.77106346530.05.201114:31Daten behalten !
20.81849180530.05.201114:31Daten behalten !
30.79345985130.05.201114:31diese Zeile löschen ?
40.79345985130.05.201114:31diese Zeile löschen ?
50.79345985130.05.201114:31diese Zeile löschen ?
60.79345985130.05.201114:31diese Zeile löschen ?
70.79345985130.05.201114:31diese Zeile löschen ?
80.79345985130.05.201114:31Daten behalten !
90.77566814430.05.201114:31Daten behalten !
100.76144003730.05.201114:31Daten behalten !
110.75589388230.05.201114:31diese Zeile löschen ?
120.75589388230.05.201114:31diese Zeile löschen ?
130.75589388230.05.201114:31diese Zeile löschen ?
140.75589388230.05.201114:31diese Zeile löschen ?
150.75589388230.05.201114:31diese Zeile löschen ?
160.75589388230.05.201114:31diese Zeile löschen ?
170.75589388230.05.201114:31diese Zeile löschen ?
180.75589388230.05.201114:31diese Zeile löschen ?
190.75589388230.05.201114:31Daten behalten !
200.74772450130.05.201114:31diese Zeile löschen ?
210.74772450130.05.201114:31diese Zeile löschen ?
220.74772450130.05.201114:31Daten behalten !
230.69513539630.05.201114:31diese Zeile löschen ?
240.69513539630.05.201114:31Daten behalten !
250.69051014930.05.201114:31diese Zeile löschen ?
260.69051014930.05.201114:31diese Zeile löschen ?
270.69051014930.05.201114:31diese Zeile löschen ?
280.69051014930.05.201114:31diese Zeile löschen ?
290.69051014930.05.201114:31diese Zeile löschen ?
300.69051014930.05.201114:31diese Zeile löschen ?
310.69051014930.05.201114:31diese Zeile löschen ?
320.69051014930.05.201114:31diese Zeile löschen ?
330.69051014930.05.201114:31diese Zeile löschen ?
340.69051014930.05.201114:31diese Zeile löschen ?
350.69051014930.05.201114:31Daten behalten !


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Userbild
Anzeige
AW: Nachfrage
30.05.2011 18:32:04
Horst
Hallo Matthias,
ich habe dir zum Testen eine Beispiel.xls hochgeladen:
https://www.herber.de/bbs/user/75088.zip
Es sollten bis auf den zeitlich letzten Eintrag alle Zeilen mit gleichem Datum und Uhrzeit gelöscht werden (die gelb markierten Zeilen sollen übrig bleiben). Datum und Uhrzeit stehen gemeinsam in einer Zelle.
Die Arbeitsmappe wird von einem externen Programm erzeugt und mittels VBA-Code (in einer externen .xls) entsprechend aufbereitet und dann für weitere statistische Auswertungen benötigt. Das externe Programm überschreibt die Datei minütlich, die Datei wird dabei stets größer, da Zeilen dazugeschrieben werden; die VBA Prozedur des Löschens der doppelten Einträge dient gewissermaßen dazu, zum aktuellen Zeitpunkt eine aktuelle Basis für die weitere Verarbeitung zu haben. Wichtig ist, dass das Makro von einer externen .xls aus ausgeführt werden kann, da durch das Überschreiben ein in der Bsp.xls enthaltenes Makro gelöscht würde.
Besten Dank vorab für deine Bemühungen!
Gruß, Horst
Anzeige
AW: Nachfrage
30.05.2011 19:22:43
Matthias
Hallo
Option Explicit
Sub loeschen()
Dim x&
For x = 83 To 2 Step -1
If Format(Cells(x, 45), "hh:mm") = Format(Cells(x - 1, 45), "hh:mm") Then
Cells(x - 1, 46) = "diese Zeile löschen ?"
End If
Next
End Sub
https://www.herber.de/bbs/user/75089.xls


Die Arbeitsmappe wird von einem externen Programm erzeugt und mittels VBA-Code (in einer externen .xls) entsprechend aufbereitet
Dann kannst Du den Code in die (externen .xls) legen und Dich dann auf die Zieldatei beziehen.
Userbild
Anzeige
AW: Nachfrage
30.05.2011 19:49:46
Horst
Hallo Matthias,
besten Dank vorab, im Grunde macht der Code jetzt schon das richtige, nur sollten die Zellen gelöscht (oder alternativ die übrigbleibenden markierten in ein neues Tabellenblatt kopiert) werden. Desweiteren muss berücksichtigt werden, dass der Code in einer externen .xls läuft (zb. der "control.xls"), d.h. es sollte irgendwo der Pfad "C:\....\Bsp.xls" eingebaut werden.
Was hat es eigentlich mit den Steps 83 u. 46 auf sich? Ist das eine Art "Moving Window", die über die Zeilen drüberliest. Müsste man die Werte, sofern mehr als 83 Zeilen das gleiche Datum aufweisen, anpassen?
Wäre toll, wenn du die Ergänzungen noch einbauen könntest!
Beste Grüße, Horst
Anzeige
fast richtig erkannt
30.05.2011 20:22:28
Matthias
Hallo
Was hat es eigentlich mit den (mit den Steps 83 u. 46) auf sich
Es heißt Step -1
Also ab Zeile 83 immer (Zeile -1) -> (Step-1)
Deine letzte beschrieben Zeile (in Deiner Datei) ist Zeile 82.
Da wir rückwärts in der Schleife zählen, müssen wir bei Zeile 83 anfangen mit der Schleife
Cells(x, 45) ist nichts anderes als Cells(x, "AS")
das heißt die 45. Spalte ist die Spalte("AS")
Die 46 - also Cells(x, 46) ist die Spalte(46) also die Spalte("AT")
Das heißt
Alles fast richtig erkannt (das müsste man tatsächlich anpassen)
anstatt nur zu markieren könnte man nun auch löschen
schau mal im Archiv nach: Zeile(n) löschen.
Userbild
Anzeige
AW: fast richtig erkannt
30.05.2011 21:27:45
Horst
Besten Dank!
Eine Frage zu dem Löschen der Zeilen:
mit "Cells(x-1, 45).Delete" wird nur die 45. Spalte, d.h. Spalte AS gelöscht.
If Format(Cells(x, 45), "hh:mm") = Format(Cells(x - 1, 45), "hh:mm") Then
Cells(x - 1, 45).Delete
Wie gebe ich aber an, dass in Abhängigkeit der Spalte AS (Markierung) der gesamte Zeilenbereich "A:AS" gelöscht wird?
Dann ist noch offen, wie ich nun einen Laufwerkspfad im Makro angeben kann. Das Makro steht z.B. in der "A.xls" und die zu löschenden Zeilen befinden sich in der "B.xls".
Wäre super, wenn du deinen Code noch um die zwei Punkte erweitern könntest.
Gruß, Horst
Anzeige
Zeile löschen ...
30.05.2011 21:50:07
Matthias
Hallo
mit Cells(x - 1, 45).Delete löschst Du nur die Zelle
um eine Zeile zu löschen musst Du mit Rows(Deine Zeile).delete oder mit EntireRow arbeiten.
Das mit dem Laufwerkspfad kann ich nicht ganz nachvollziehen.
Wenn die Datei eh von einem Makro erstellt wird, dann musst Du eben den Pfad von dort benutzen.
Userbild
AW: Zeile löschen ...
30.05.2011 21:56:11
Horst
Hallo
die Datei wird von einem eigenständigen, externen Programm erzeugt (ein Nicht-Excel-Programm) und minütlich überschrieben. Sämtliche zur Bearbeitung dieser "externen" .xls notwendigen Makros befinden sich in der "control.xls", die mit Pfadangabe auf die externe, vom Nicht-Excel-Programm erzeugte .xls zugreift. Daher wäre der Einbau einer Pfadangabe wichtig.
Danke vorab.
Anzeige
AW: Zeile löschen ...
31.05.2011 06:40:50
Hajo_Zi
Hallo Horst,
wenn Du in der Datei was machen willst muß Sie doch offen sein. Dann brauchst Du keinen Pfad. Den Pfad brauchst Du fürs öffnen und muss bei open angegeben werden.

AW: Zeile löschen ...
31.05.2011 13:15:23
Horst
Hallo Hajo,
korrekt. Aber dieses Öffnen sollte "im Hintergrund" erfolgen, ich dachte da eher mehr an einen Code in der Art:
Sub update()
Dim objWb As Workbook
Dim strPath1 As String, strFile As String, strTxtFile As String
strPath1 = "C:\Dokumente und Einstellungen\User\Desktop\..." 'Pfad
If Right(strPath1, 1) "\" Then strPath1 = strPath1 & "\"
strFile = Dir(strPath1 & "*.xls")
Do While strFile ""
If isOpen(strFile) Then
Set objWb = Workbooks(strFile)
Else
Set objWb = Workbooks.Open(strPath1 & strFile)
End If
intIndex = intIndex + 1
Application.Calculate
objWb.Close True
strFile = Dir
Loop
objWb.Close False
Jetzt bräuchte ich abschließend nur Hilfe, um das Löschen von doppelten Zeilen (siehe voriger Beitrag) hier noch einzubauen. Wäre toll, wenn das jemand schaffen würde.
Besten Dank vorab,
Horst
Anzeige
AW: Doppelte Einträge löschen
31.05.2011 13:36:41
Rudi
Hallo,
Sub ZeilenLoeschen()
Dim i As Long, oZeile As Object, rngDel As Range, wkb As Workbook
Const sFile As String = "Bsp.xls"   'anpassen
Const sPfad As String = "c:\test\"  'anpassen
Application.ScreenUpdating = False
On Error Resume Next
Set wkb = Workbooks(sFile)
On Error GoTo 0
If wkb Is Nothing Then Set wkb = Workbooks.Open(sPfad & sFile)
Set oZeile = CreateObject("Scripting.dictionary")
With wkb.Sheets(1)
For i = .Cells(Rows.Count, 45).End(xlUp).Row To 1 Step -1
If oZeile.exists(.Cells(i, 45).Text) Then
If rngDel Is Nothing Then
Set rngDel = .Cells(i, 45)
Else
Set rngDel = Union(rngDel, .Cells(i, 45))
End If
Else
oZeile(.Cells(i, 45).Text) = 0
End If
Next i
End With
If Not rngDel Is Nothing Then
rngDel.EntireRow.Delete
End If
wkb.Close True
End Sub

Gruß
Rudi
Anzeige
AW: Doppelte Einträge löschen
31.05.2011 21:29:44
Horst
Hallo Rudi,
allerbesten Dank!!
Du hast den Fall wirklich perfekt gelöst. Das Makro tut genau, was es soll.
Kannst du mir deine Mailadresse senden (xpdefault@hotmail.com), für den Fall, dass ich in Zukunft mal wieder professionelle Hilfe benötige (gerne auch gegen Honorar).
Schöne Grüße,
Horst

315 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige