Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1680to1684
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

Zeilen Zusammenfassen

Zeilen Zusammenfassen
26.03.2019 21:45:10
Daniel
Hallo liebes Herbers Excel-Forum,
ich habe 1-N Datensätze mit einem gleichbleibenden Schlüssel und möchte diese Zusammenfassen.
Schlüssel - Nr1 - Ankunft - Abfahrt -Nr2
101 133-7 - 2375 - 20:52 - #NV - 2375
101 133-7 - 2375 - 21:12 - 09:05:00 - 2374
Aus der ersten Zeile brauche ich die ersten 3 Felder aus der zweiten Zeile brauche ich die letzten 2 Felder.
Am besten soll die Datenquelle so bleiben wie sie ist und das "Zusammengefasste"
in ein neues Tabellenblatt mit in diesem Fall folgenden Feldern übertragen werden.
Schlüssel - Nr1 - Ankunft - Abfahrt - Nr2
101 133-7 - 2375 - 20:52 - 09:05:00 - 2374
Ich bin in VBA garnich fit und hab mich heute schon einige Stunden "beschäftigt"...
Mit sowas hier zum z.B. letzte Zeile finden...
Sub LetzteZeileFinden()
Dim letzeZeile As Integer
letzeZeile = ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
MsgBox (Cells(letzeZeile, 2).Value)
End Sub

Und mit sowas hier um "unique" Werte zu finden...

Sub test()
Dim Values() As Variant
Values = GetUniqueVals(Selection)
Dim i As Integer
For i = LBound(Values) To UBound(Values)
Debug.Print (Values(i))
MsgBox (Values(i))
Next
End Sub


Function GetUniqueVals(ByRef Data As Range) As Variant()
Dim cell As Range
Dim uniqueValues() As Variant
ReDim uniqueValues(0)
For Each cell In Data
If Not IsEmpty(cell) Then
If Not InArray(uniqueValues, cell.Value) Then
If IsEmpty(uniqueValues(LBound(uniqueValues))) Then
uniqueValues(LBound(uniqueValues)) = cell.Value
Else
ReDim Preserve uniqueValues(UBound(uniqueValues) + 1)
uniqueValues(UBound(uniqueValues)) = cell.Value
End If
End If
End If
Next
GetUniqueVals = uniqueValues
End Function


Function InArray(ByRef SearchWithin() As Variant, ByVal SearchFor As Variant) As Boolean
Dim i As Integer
Dim matched As Boolean 'Default value of boolean is false, we make true only if we find a   _
_
match
For i = LBound(SearchWithin) To UBound(SearchWithin)
If SearchWithin(i) = SearchFor Then matched = True
Next
InArray = matched
End Function

Ich bin mir nicht sicher ob ich auf einem guten Weg bin und bin bereit alles zu vergessen ?
Ich glaube ich halte es nicht aus mich so Stück für Stück "durchzuwurschteln",
mir fehlt es auch einfach an Grundlagen in VBA für sowas.
Daher Frage ich euch liebe Community!
Ich zeige es auch gerne einem Helfer / einer Helferin via Teamviewer (bei Bedarf).
Hier 2 Tabellen IST und SOLL mit mehr Beispielen:
(Nochmal als Anhang weil hier Tabellen nicht so toll dargestellt werden.
IST:
Schlüssel Nr1 Ankunft Abfahrt Nr2
101 133-7 2375 20:52 #NV 2375
101 133-7 2375 21:12 09:05:00 2374
101 134-7 2376 22:00 22:15:00 2375
101 135-7 2375 22:30 23:00:00 2374
101 107-1 2268 07:53 #NV 2268
101 107-1 2268 08:13 09:05:00 2374
101 107-1 2374 08:56 09:05:00 2374
SOLL:
Schlüssel Nr1 Ankunft Abfahrt Nr2
101 133-7 2375 20:52 09:05:00 2374
101 134-7 2376 22:00 22:15:00 2375
101 135-7 2375 22:30 23:00:00 2374
101 107-1 2268 07:53 09:05:00 2374
Userbild
Alles Liebe
Daniel

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Keep it simple!
27.03.2019 07:09:59
MCO
Guten Morgen!
Einfache Schleife mit 2 Bedingungen, ohne Schnickschnack.
Sub zusammenführen()
Dim zl As Single
Dim lz As Single, ende As Single
lz = 0
Sheets(2).Cells.Clear
ende = Range("A1").End(xlDown).Row
For zl = 1 To ende
lz = lz + 1
If Not IsError(Cells(zl, 5)) Then
Range("A" & zl & ":F" & zl).Copy Sheets(2).Cells(lz, "a")
Else
Range("A" & zl & ":D" & zl).Copy Sheets(2).Cells(lz, "a")
zl = zl + 1
Range("E" & zl & ":F" & zl).Copy Sheets(2).Cells(lz, "E")
End If
Next zl
End Sub
Gruß, MCO
AW: Keep it simple!
27.03.2019 09:54:04
Daniel
Hast du das getestet MCO? Haut noch nicht ganz hin. Er bekommt spätestens dann Probleme, wenn ein Schlüssel mehr als zwei Mal vorkommt und entsprechend nicht immer ein #NV in Spalte D der zu überspringenden Zeile steht (Übrigens 4, nicht 5).
Etwas angepasst könnte es so gehen (bei mir getestet):
Sub zusammenführen()
Dim zl As Single, i As Long
Dim lz As Single, ende As Single
lz = 0
Sheets(2).Cells.Clear
ende = Sheets(1).Range("A1").End(xlDown).Row
With Sheets(1)
For zl = 1 To ende
lz = lz + 1
.Range("A" & zl & ":C" & zl).Copy Sheets(2).Cells(lz, "A")
For i = zl To ende
If .Cells(i + 1, 1) = .Cells(i, 1) Then
.Range("D" & zl & ":E" & zl).Copy Sheets(2).Cells(lz, "D")
zl = zl + 1
Else
.Range("A" & zl & ":E" & zl).Copy Sheets(2).Cells(lz, "a")
Exit For
End If
Next i
Next zl
End With
End Sub
Gruß
Daniel
Anzeige
AW: Keep it simple!
27.03.2019 10:37:19
Daniel
Ihr seit toll, Danke fürs schnelle Antworten. Ich glaube wir sind nah dran...
Das geb ich rein...
Userbild
Und so kommt es raus...
Userbild
Es werden die Formeln kopiert nicht der Wert?
AW: Keep it simple!
27.03.2019 10:44:41
Daniel
Und leider sind die Schlüssel noch mehrfach vorhanden.
AW: Keep it simple!
27.03.2019 10:49:59
Daniel
Lade mal bitte deine Tabelle hoch, es ist mühsam das nachzubauen und ich weiß nicht, wie deine Zellen formatiert sind.
AW: Keep it simple!
27.03.2019 11:22:00
Daniel
Sieht so aus als hättest du nicht meinen Code benutzt, der hatte ja extra das Problem mit den doppelten Schlüsseln vermieden.
Habe jetzt noch angepasst, dass nur die Werte und nicht die Formeln kopiert werden und es sieht für mich aus wie es sollte.
https://www.herber.de/bbs/user/128693.xlsm
AW: Keep it simple!
27.03.2019 11:31:09
Daniel
Das war es auch noch nicht, hatte ich übersehen. Er hat immer nur die letzte Zeile pro Schlüssel kopiert. Probiers mal hiermit:
Sub zusammenführen()
Dim zl As Single, i As Long
Dim lz As Single, ende As Single
Dim wsZiel As Worksheet, wsQuelle As Worksheet
Set wsQuelle = Sheets("Druckliste")
Set wsZiel = Sheets("Ziel")
lz = 1
wsZiel.Cells.Clear
wsQuelle.Range("A1:E1").Copy wsZiel.Range("A1")
ende = wsQuelle.Range("A1").End(xlDown).Row
With wsQuelle
For zl = 2 To ende
lz = lz + 1
.Range("A" & zl & ":C" & zl).Copy
wsZiel.Cells(lz, "A").PasteSpecial xlPasteValuesAndNumberFormats
For i = zl To ende
If .Cells(i + 1, 1) = .Cells(i, 1) Then
.Range("D" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "D").PasteSpecial xlPasteValuesAndNumberFormats
zl = zl + 1
Else
If .Cells(i - 1, 1) = .Cells(i, 1) Then
.Range("D" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "D").PasteSpecial xlPasteValuesAndNumberFormats
Exit For
End If
.Range("A" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "a").PasteSpecial xlPasteValuesAndNumberFormats
Exit For
End If
Next i
Next zl
End With
End Sub

Anzeige
AW: Keep it simple!
27.03.2019 22:16:26
Daniel
Das scheint eine gute Arbeit zu leisten, ich danke dir schonmal von Herzen und teste jetzt fleissig.
Hast du noch ne Idee wie ich die erste Spalte vorher sortieren kann damit sichergestellt ist das es fortlaufende und eben die doppelten Werte schonmal richtig sortiert hat? Ich hoffe ich drücke mich verständlich aus. Alles Liebe & Danke soweit! Toll!
AW: Keep it simple!
28.03.2019 09:16:37
Daniel
Klar geht das! Habe mal angenommen, dass zuerst nach Schlüssel und nachrangig nach Ankunftszeit sortiert werden soll. Kann man ohne weiteres in der markierten Zeile im Code anpassen (ListColumns(X) bezieht sich auf die zu sortierende Spalte).
Sub zusammenführen()
Dim zl As Single, i As Long
Dim lz As Single, ende As Single
Dim wsZiel As Worksheet, wsQuelle As Worksheet
Set wsQuelle = Sheets("Druckliste")
Set wsZiel = Sheets("Ziel")
lz = 1
Application.ScreenUpdating = False
With wsQuelle.ListObjects("Tabelle3")
.Range.Sort Key1:=.ListColumns(1), Order1:=xlAscending, Header:=no, key2:=.ListColumns( _
3), order2:=xlAscending
End With
wsZiel.Cells.Clear
wsQuelle.Range("A1:E1").Copy wsZiel.Range("A1")
ende = wsQuelle.Range("A1").End(xlDown).Row
With wsQuelle
For zl = 2 To ende
lz = lz + 1
.Range("A" & zl & ":C" & zl).Copy
wsZiel.Cells(lz, "A").PasteSpecial xlPasteValuesAndNumberFormats
For i = zl To ende
If .Cells(i + 1, 1) = .Cells(i, 1) Then
.Range("D" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "D").PasteSpecial xlPasteValuesAndNumberFormats
zl = zl + 1
Else
If .Cells(i - 1, 1) = .Cells(i, 1) Then
.Range("D" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "D").PasteSpecial xlPasteValuesAndNumberFormats
Exit For
End If
.Range("A" & zl & ":E" & zl).Copy
wsZiel.Cells(lz, "a").PasteSpecial xlPasteValuesAndNumberFormats
Exit For
End If
Next i
Next zl
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Grüße
Daniel
Anzeige
Stimmt, Datenimportfehler
27.03.2019 11:26:54
MCO
Hallo Daniel!
Ja, hatte es getestet mit den tabellarischen Daten.
Allerdings hatte ich die Sätze nach Leerzeichen getrennt, daher hatte sich da eine weitere Spalte eingeschlichen.
Gruß, MCO

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige