Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1304to1308
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
Inhaltsverzeichnis

Duplikate zusammenfassen

Duplikate zusammenfassen
09.04.2013 11:17:26
Andreas
Moin,
Ich will in meiner Tabelle Duplikate zusammenfassen, sodass er immer den ältesten und jüngsten Eintrag von Spalte A ausgibt.
Im besten Fall stehen sie auch immer direkt untereinander, aber das muss nicht immer der Fall sein.

Die Datei https://www.herber.de/bbs/user/84797.xls wurde aus Datenschutzgründen gelöscht


Ich habe allerdings keine Ahnung, wie ich das per VBA machen soll. Könnt ihr mir sagen wie?
Gruß
Andreas

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Duplikate zusammenfassen
09.04.2013 15:24:31
Sheldon
Hallo Andreas,
keine Ahnung, welche Werte du zusammen fassen willst. Ich habs mal so interpretiert, dass du für jeden Buchstaben den kleinsten "Begin" und den höchsten "End" Wert haben willst. Dann so wie in Tabelle2:
https://www.herber.de/bbs/user/84802.xls
Gruß
Sheldon

AW: Duplikate zusammenfassen
09.04.2013 16:10:44
Andreas
Hallo Sheldon,
Dank für deine Hilfe! Und ja, so in etwa wäre dann die Tabelle. Wie kann ich das programmieren?
Viele Grüße
Andreas

AW: Duplikate zusammenfassen
09.04.2013 16:35:54
Sheldon
Hallo Andreas,
wieso muss das denn unbedingt programmiert werden? Sicher gibts auch unzählige VBA-Lösungsmöglichkeiten, aber wenns per Formel geht, ist das ´doch idR die bessere Wahl. Welcher Grund spricht für VBA?
Gruß
Sheldon

Anzeige
AW: Duplikate zusammenfassen
09.04.2013 16:43:55
Andreas
Hallo Sheldon,
die Daten erstelle ich so schon über VBA, indem ich mehrere Tabellenblätter (Zahl variabel) zusammenfüge und schon einige Formatierungen, zb. die Datumsangabe in Tag und Zeit splitte. Es entsteht eine Datei, die etwa 1000 Zeilen haben kann. Ich müsste dann in deinem Fall, die Spalte A kopieren und Duplikate entfernen und deine Formel anwenden, aber eigentlich will ich damit erreichen, dass mit einem Button-Klick die Tabelle sich komplett selber berechnet. Du hast viel mehr Ahnung als ich, aber meinst du nciht, dass in diesem Fall die VBA Lösung schöner wäre?
Viele Grüße
Andreas

Anzeige
da muss ich passen…
09.04.2013 21:50:47
Sheldon
Hallo Andreas,
die Sache mit dem Sortieren und Duplikate entfernen funktioniert sicher, aber ich kann das nicht so mal eben aus meinem Ärmel schütteln… Von daher lass ich den Beitrag hier mal offen, mglw. fühlt sich eines der hier im Forum präsenten Genies berufen, hier was beizutragen.
Gruß
Sheldon

AW: Duplikate zusammenfassen - Zusatzfragen
09.04.2013 15:44:11
fcs
Hallo Andreas,
für den gleichen Typ überlappen sich häufig die Zeitbereiche.
Was definiert den ältesten Eintrag? Der am frühesten gestartetete Vorgang?
Was definiert den neusten Eintrag? Der als letztes beendetet Vorgang
Manchmal ist die EndeZeit und/oder Startzeit idetisch (z.B Typ G). Was dann ?
Ansonsten kann man per Makro die Liste nach dem Typ und den Datum/Zeit-Werten sortieren und dann jeweils den jüngsten und ältesten Typ-Eintrag markieren. Danach werden dann alle nicht markierten Zeilen gelöscht.
Sollen die überflüssigen Zeilen in der vorhanden Tabelle gelöscht werden oder in einer Kopie des Tabellenblatts?
Gruß
Franz

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
09.04.2013 16:08:27
Andreas
Hallo Franz,
am besten für mich zum Kontrolieren ist das ganze in deine neue Tabelle zu machen. Die überlappenden Intervalle sollen gelöscht werden. Der älteste ist der, wo er das erst Mal auftritt und der jüngste, wo er das letzte Mal aufgetreten ist. Im Falle G müsste dann von 7:03 bis 18:30 gehen.
Ich hoffe, ich konnte es etwas deutlicher machen.
Deinen Tipp mit dem markieren verstehe ich allerdnigs nicht ganz...
Vielen Dank für deine Hilfe und viele Grüße
Andreas

AW: Duplikate zusammenfassen - Zusatzfragen
09.04.2013 22:01:58
fcs
Hallo Andreas,
hier ein Makro, dass die Daten entsprechend aufbereitet.
Gruß
Franz
'Makro in einem Allgemeinen Modul
Sub DatenAufbereiten()
If MsgBox("Doppelte Einträge im aktiven Blatt aufbereiten?", _
vbQuestion + vbOKCancel, "Doppelte Entfernen") = vbCancel Then Exit Sub
Dim wksNeu As Worksheet
Dim arrData As Variant, arrErledigt() As Boolean, arrDoNotDelete() As Boolean
Dim varTyp As Variant, Zeile As Long, Zeile1 As Long
ActiveSheet.Copy After:=ActiveSheet
Set wksNeu = ActiveSheet
'Daten zur Bearbeitung in Daten-Array einlesen
With wksNeu
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
arrData = .Range(.Cells(1, 1), .Cells(Zeile, 7))
'Hilfsarrays anlegen
ReDim arrDoNotDelete(1 To Zeile), arrErledigt(1 To Zeile)
End With
For Zeile = 2 To Zeile
If arrErledigt(Zeile) = False Then
arrErledigt(Zeile) = True
arrDoNotDelete(Zeile) = True
varTyp = arrData(Zeile, 1)
'Typ in Zeilen bis zum Ende der Liste vergleichen
For Zeile1 = Zeile + 1 To UBound(arrErledigt)
If varTyp = arrData(Zeile1, 1) Then
'Start-Datum/Zeiten vergleichen
If arrData(Zeile, 4) + arrData(Zeile, 6) > _
arrData(Zeile1, 4) + arrData(Zeile1, 6) Then
arrData(Zeile, 4) = arrData(Zeile1, 4) 'neues Datum-Start
arrData(Zeile, 6) = arrData(Zeile1, 6) 'neue Zeit-Start
arrData(Zeile, 2) = arrData(Zeile1, 2) 'Neuer Beginn
End If
'Ende-Datum/Zeit vergleichen
If arrData(Zeile, 5) + arrData(Zeile, 7) 

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
10.04.2013 09:00:47
Andreas
Hallo Franz,
gaaaaaanz großen Dank! Du hast schonmal sehr geholfen!!!!
So ganz richtig läuft es aber noch.
Ich musste eine Kleinigkeit mal ändern, jetzt funktioniert es zumin. mit dem Anfang schonmal.
If arrData(Zeile, 4) + arrData(Zeile, 6) > _
arrData(Zeile1, 4) + arrData(Zeile1, 6) Then
arrData(Zeile, 4) = arrData(Zeile, 4) 'neues Datum-Start
arrData(Zeile, 6) = arrData(Zeile, 6) 'neue Zeit-Start
arrData(Zeile, 2) = arrData(Zeile, 2) 'Neuer Beginn
End If
Theoretisch sollte das Ende ja richtig laufen, aber der spuckt mir nicht das Max aus.
'Ende-Datum/Zeit vergleichen
If arrData(Zeile, 5) + arrData(Zeile, 7) arrData(Zeile1, 5) + arrData(Zeile1, 7) Then
arrData(Zeile, 5) = arrData(Zeile1, 5) 'neues Datum-Ende
arrData(Zeile, 7) = arrData(Zeile1, 7) 'neue Zeit-Ende
arrData(Zeile, 3) = arrData(Zeile1, 3) 'Neues Ende
End If
Oder wo habe ich einen Denkfehler?
Viele Grüße
Andreas

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
10.04.2013 10:13:41
fcs
Hallo Andreas,
das Problem ist, dass die Datumsangaben in den Spalten D und E immer noch als Text in den Zellen stehen, während die Uhrzeiten als Excelzeiten (Bruchteil eines Tages) eingetragen sind.
Das war mir nicht aufgefallen.
Da macht Excel unter VBA eine merkwürdige Zahlenaddition draus, die dann beim Vergleichen zu falschen Ergebnissen führt.
Nach Konversion in ein echtes Datum funktioniert es.
Anpassung der Prüfungen:
                    'Start-Datum/Zeiten vergleichen
If CDate(arrData(Zeile, 4)) + arrData(Zeile, 6) > _
CDate(arrData(Zeile1, 4)) + arrData(Zeile1, 6) Then
arrData(Zeile, 4) = arrData(Zeile1, 4) 'neues Datum-Start
arrData(Zeile, 6) = arrData(Zeile1, 6) 'neue Zeit-Start
arrData(Zeile, 2) = arrData(Zeile1, 2) 'Neuer Beginn
End If
'Ende-Datum/Zeit vergleichen
If CDate(arrData(Zeile, 5)) + arrData(Zeile, 7) 

Alternativ kannst du natürlich auch dafür sorgen, dass dein vorhandenes Makro in den Spalten D und E ein "richtiges" Exceldatum einträgt.
Gruß
Franz

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
10.04.2013 10:35:36
Andreas
Hallo Franz,
das habe ich nicht gewusst, das VBA so umdenkt. Aber wiedermal vielen Dank fürs Helfen!
Eine Frage habe ich aber noch:
Wenn ich nicht das ganze Worksheet kopieren will, sondern nur die ersten 10 Spalten, wie kann ich das einbauen, so etwa
ActiveSheet.Range("A:J").Copy After:=ActiveSheet ?
Viele Grüße
Andreas

AW: Duplikate zusammenfassen - Zusatzfragen
10.04.2013 10:52:49
Andreas
Hallo Franz,
doch noch eine Sache mehr.
Ich habe versucht jetzt dein Makro auf mich anzupassen, also die Spaltenindizes.
Spalte A wie im Beispiel
Spalte B-D sonstige Daten
Spalte E-J Zeiten wie im Beispiel (4=7,5=8,6=9.....)
Jetzt kommt aber ein Typenunverträglichkeitsfehler.
HÄÄÄ?
Gruß
Andreas

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
10.04.2013 13:30:03
fcs
Hallo Andreas,
eigentlich ist es in Ordnung, dass du die entsprechenden Spaltenwerte um 3 erhöhst, wenn du 3 weitere Spalten B bis D hast.
Da muss du irgend einen Spalten-Wert im Makro übersehen haben. Die Typ-Unverträglichkeit kann eigentlich nur passieren bei der Datums-Konversion.
Evtl. gibt es in deiner Tabelle Zeilen ohne Datums/Zeitwerte - CDate mag keine Texte verschieden von Datum oder Leerwerte.
Wenn nicht das ganze Blatt kopiert werden soll, dann muss man erst dass das aktive Blatt merken/einer Variablen zuordnen, dann das neue Blatt anlegen und die Daten kopieren.
Ich hab das alles in das Makro eingebaut.
Gruß
Franz
'Makro in einem Allgemeinen Modul
Sub DatenAufbereiten()
If MsgBox("Doppelte Einträge im aktiven Blatt aufbereiten?", _
vbQuestion + vbOKCancel, "Doppelte Entfernen") = vbCancel Then Exit Sub
Dim wksNeu As Worksheet, wksQuelle As Worksheet
Dim arrData As Variant, arrErledigt() As Boolean, arrDoNotDelete() As Boolean
Dim varTyp As Variant, Zeile As Long, Zeile1 As Long
'Tabelle mit den Quelldaten setzen
Set wksQuelle = ActiveSheet
'neue Zieltabelle anlegen
Set wksNeu = ActiveWorkbook.Worksheets.Add(after:=wksQuelle)
'Daten in Zieltabelle kopieren
wksQuelle.Range("A:J").Copy Destination:=wksNeu.Range("A:J")
'Daten zur Bearbeitung in Daten-Array einlesen
With wksNeu
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
arrData = .Range(.Cells(1, 1), .Cells(Zeile, 10))
'Hilfsarrays anlegen
ReDim arrDoNotDelete(1 To Zeile), arrErledigt(1 To Zeile)
End With
For Zeile = 2 To Zeile
If arrErledigt(Zeile) = False Then
arrErledigt(Zeile) = True
arrDoNotDelete(Zeile) = True
varTyp = arrData(Zeile, 1)
'Typ in Zeilen bis zum Ende der Liste vergleichen
For Zeile1 = Zeile + 1 To UBound(arrErledigt)
If varTyp = arrData(Zeile1, 1) Then
'Start-Datum/Zeiten vergleichen
If CDate(arrData(Zeile, 7)) + arrData(Zeile, 9) > _
CDate(arrData(Zeile1, 7)) + arrData(Zeile1, 9) Then
arrData(Zeile, 7) = arrData(Zeile1, 7) 'neues Datum-Start
arrData(Zeile, 9) = arrData(Zeile1, 9) 'neue Zeit-Start
arrData(Zeile, 5) = arrData(Zeile1, 5) 'Neuer Beginn
End If
'Ende-Datum/Zeit vergleichen
If CDate(arrData(Zeile, 8)) + arrData(Zeile, 10) 

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
12.04.2013 08:45:31
Andreas
Hallio Franz,
ich habe mir das doch nochmal genauer angeguckt, einen Fehler in der Logik entdeckt und brauche es leider doch etwas anders:
https://www.herber.de/bbs/user/84838.xls
Nur die, wo ein "Zeitsprung" ist, sollen erhalten bleiben. Die rot markierten sollen jetzt jeweils zusammgefasst werden, da die Zeiten sich teilweise überschneiden und teilweise direkt angrenzen.
Verstehst du, wie ich es meine?
Viele Grüße
Andreas

AW: Duplikate zusammenfassen - Zusatzfragen
12.04.2013 15:59:14
fcs
Hallo Andreas,
ich hab das Makro mal in die Richtung angepasst.
Da einfacher zu handhaben werden in der neuen Tabelle temporär 2 Hilfsspalten eingefügt.
Im Makro muss dann weniger gerechnet werden.
Gruß
Franz
'Makro in einem Allgemeinen Modul
Sub DatenAufbereiten_Neu()
If MsgBox("Doppelte Einträge im aktiven Blatt aufbereiten?", _
vbQuestion + vbOKCancel, "Doppelte Entfernen") = vbCancel Then Exit Sub
Dim wksNeu As Worksheet, wksQuelle As Worksheet
Dim arrData As Variant, arrErledigt() As Boolean, arrDoNotDelete() As Boolean
Dim varTyp As Variant, Zeile As Long, Zeile1 As Long
'Tabelle mit den Quelldaten setzen
Set wksQuelle = ActiveSheet
'neue Zieltabelle anlegen
Set wksNeu = ActiveWorkbook.Worksheets.Add(after:=wksQuelle)
'Daten in Zieltabelle kopieren
wksQuelle.Range("A:J").Copy Destination:=wksNeu.Range("A:J")
'Daten zur Bearbeitung in Daten-Array einlesen
With wksNeu
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
'Hilfsspalten mit Datum+Zeit für Start und Ende in Excelformat erstellen
.Cells(1, 11) = "Start-Datum-Zeit"
.Cells(1, 12) = "Ende-Datum-Zeit"
With .Range(.Cells(2, 11), .Cells(Zeile, 12))
.FormulaR1C1 = "=DATEVALUE(RC[-4])+RC[-2]"
.Calculate
.Value = .Value
.NumberFormat = "DD.MM.YYYY hh:mm"
End With
'Daten nach Typ und Daten in Hilfsspalten (Start, Ende) sortieren
With .Range(.Cells(1, 1), .Cells(Zeile, 12))
.Sort Key1:=.Cells(1, 1), Order1:=xlAscending, _
Key2:=.Cells(1, 11), Order2:=xlAscending, _
Key3:=.Cells(1, 12), Order3:=xlAscending, Header:=xlYes
End With
'Daten in Array einlesen
arrData = .Range(.Cells(1, 1), .Cells(Zeile, 12))
'Hilfsarrays anlegen
ReDim arrDoNotDelete(1 To Zeile), arrErledigt(1 To Zeile)
End With
For Zeile = 2 To Zeile
If arrErledigt(Zeile) = False Then
arrErledigt(Zeile) = True
arrDoNotDelete(Zeile) = True
varTyp = arrData(Zeile, 1)
'Typ in Zeilen bis zum Ende der Liste vergleichen
For Zeile1 = Zeile + 1 To UBound(arrErledigt)
If varTyp = arrData(Zeile1, 1) Then
'Start-Datum/Zeiten mit Ende der vorherigen Zeile vergleichen
If arrData(Zeile1, 11) 

Anzeige
AW: Duplikate zusammenfassen - Zusatzfragen
15.04.2013 13:08:16
Andreas
Hi Franz,
sorry, dass ich dich immer wieder nerve, aber bei mir passeirt leider nichts :(
Ich bekomme einen Typenunverträglickeitsfehler bei
If arrData(Zeile1, 11) 
Bis jetzt prüfst du ja auch nur, ob die das Ende des ersten Array mit dem Anfang des zweiten Arrays zusammen passen. Ich müsste ja dann noch die anderen Fälle dazu schreiben, richtig? Und die ganze Sache mit den Arrays....überprüft der nur die beiden Folge Zeilen oder alles mit allem, wenn in Spalte A selber Wert gefunden wurde?
Víele Grüße
Andreas

AW: Duplikate zusammenfassen - Zusatzfragen
15.04.2013 20:38:46
fcs
Hallo Andreas,
mit der folgenden Anpassung in dem Prüfabschnitt sollten auch die Variationen im Problem-Beispiel korrekt abgearbeitet werden.
Gruß
Franz
            'Typ in Zeilen bis zum Ende der Liste vergleichen
For Zeile1 = Zeile + 1 To UBound(arrErledigt)
If varTyp = arrData(Zeile1, 1) Then
'Start-Datum/Zeiten mit dem jewils neuen Ende vergleichen
If arrData(Zeile1, 11)  arrData(Zeile, 12) Then
arrData(Zeile, 8) = arrData(Zeile1, 8) 'neues Datum-Ende
arrData(Zeile, 10) = arrData(Zeile1, 10) 'neue Zeit-Ende
arrData(Zeile, 6) = arrData(Zeile1, 6) 'Neues Ende
arrData(Zeile, 12) = arrData(Zeile1, 12)
End If
arrErledigt(Zeile1) = True
Else
Zeile = Zeile1 - 1
Exit For
End If
Else
Exit For
End If
Next Zeile1

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige