ich suche eine Möglichkeit um Zeilen mit Text auf Grundlage von 2 Vorbedingungen zu konsolidieren:

Im nächsten Schritt soll die Funktion per Kontrollkästchen aktivierbar sein, da die sie nur optional sein.
Vielen Dank im Voraus!
Jome

Datum|Tag|Kalenderwoche|Monat|Sprint|Mitarbeiter|Rolle|Tätigkeit|Skill-Level|Aktivität|Dauer|MT Kosten|Faktura
Diese Liste soll nun per Kontrollkästchen um die besagte Funktion erweitert werden.Sub Taetigkeiten_zusammenfassen()
Dim wksData As Worksheet, wksTaet As Worksheet
Dim Zeile_L As Long
Dim Zeile As Long, Zeile1 As Long, varDatum, varMA, bolDelete As Boolean
'Tabellenblatt mit den Daten setzen
Set wksData = ActiveWorkbook.Worksheets("Daten") 'Blattame ggf. anpassen
'Tabellenblatt mit den gruppierten Erggebnisdaten setzen
Set wksTaet = ActiveWorkbook.Worksheets("Tätigkeiten") 'Blattame ggf. anpassen
Application.ScreenUpdating = False
With wksTaet
.UsedRange.ClearContents
.Columns(1).NumberFormat = "DD.MM.YYYY"
End With
With wksData
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Datumswerte in Spalte A kopieren
.Range(.Cells(1, 1), .Cells(Zeile_L, 1)).Copy
wksTaet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'Datumswerte in Spalte F kopieren
.Range(.Cells(1, 6), .Cells(Zeile_L, 6)).Copy
wksTaet.Cells(1, 2).PasteSpecial Paste:=xlPasteValues
'Taetigkeiten in Spalte H kopieren
.Range(.Cells(1, 8), .Cells(Zeile_L, 8)).Copy
wksTaet.Cells(1, 3).PasteSpecial Paste:=xlPasteValues
End With
With wksTaet
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Daten sortieren
With .Range(.Cells(1, 1), .Cells(Zeile_L, 3))
.Sort Key1:=.Range("A1"), order1:=xlAscending, _
Key2:=.Range("B1"), order2:=xlAscending, _
Key3:=.Range("C1"), order3:=xlAscending, Header:=xlYes
End With
'Tätigkeiten von MA am Datum in jeweils 1. Zeile überragen
For Zeile = 1 To Zeile_L + 1
If varDatum .Cells(Zeile, 1) Or varMA .Cells(Zeile, 2) Then
'1. Zeile, MA-Name und Datum merken wenn Name oder Datum wechselt
Zeile1 = Zeile
varDatum = .Cells(Zeile, 1).Value
varMA = .Cells(Zeile, 2).Value
Else
'Tätigkeit in 1. Zeile in Spalte C hinzufügen
.Cells(Zeile1, 3).Value = _
.Cells(Zeile1, 3).Value & ";" & .Cells(Zeile, 3).Value
'Inhalt in Zeile löschen
.Rows(Zeile).ClearContents
bolDelete = True 'merken, dass gelöscht wurde
End If
Next
If bolDelete = True Then
'leere Zeilen löschen
With .Range(.Cells(1, 1), .Cells(Zeile_L, 1))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Activate
.Range("A1").Select
.Columns.AutoFit
End With
Application.ScreenUpdating = True
End Sub
sub Taetigkeiten_zusammenfassen()
Dim wksData As Worksheet, wksTaet As Worksheet
Dim Zeile_L As Long
Dim Zeile As Long, Zeile1 As Long, varDatum, varMA, bolDelete As Boolean
'Tabellenblatt mit den Daten setzen
Set wksData = ActiveWorkbook.Worksheets("Overview") 'Blattame ggf. anpassen
'Tabellenblatt mit den gruppierten Erggebnisdaten setzen
Set wksTaet = ActiveWorkbook.Worksheets("Ergebnis") 'Blattame ggf. anpassen
Application.ScreenUpdating = False
With wksTaet
.UsedRange.ClearContents
.Columns(1).NumberFormat = "DD.MM.YYYY"
End With
With wksData
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Datumswerte in Spalte A kopieren
.Range(.Cells(22, 1), .Cells(Zeile_L, 1)).Copy
wksTaet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'Datumswerte in Spalte F kopieren
.Range(.Cells(22, 6), .Cells(Zeile_L, 6)).Copy
wksTaet.Cells(1, 2).PasteSpecial Paste:=xlPasteValues
'Taetigkeiten in Spalte H kopieren
.Range(.Cells(22, 8), .Cells(Zeile_L, 8)).Copy
wksTaet.Cells(1, 4).PasteSpecial Paste:=xlPasteValues
'Stunden in Spalte K kopieren
.Range(.Cells(22, 11), .Cells(Zeile_L, 11)).Copy
wksTaet.Cells(1, 3).PasteSpecial Paste:=xlPasteValues
End With
Sub Taetigkeiten_zusammenfassen()
Dim wksData As Worksheet, wksTaet As Worksheet
Dim Zeile_L As Long
Dim Zeile As Long, Zeile1 As Long, varDatum, varMA, bolDelete As Boolean
'Tabellenblatt mit den Daten setzen
Set wksData = ActiveWorkbook.Worksheets("Overview") 'Blattame ggf. anpassen
'Tabellenblatt mit den gruppierten Erggebnisdaten setzen
Set wksTaet = ActiveWorkbook.Worksheets("Ergebnis") 'Blattame ggf. anpassen
Application.ScreenUpdating = False
With wksTaet
.UsedRange.ClearContents
.Columns(1).NumberFormat = "DD.MM.YYYY"
' .Columns(3).NumberFormat = "#,##0.00" ' wenn Dauer als Dezimalzahl
.Columns(3).NumberFormat = "[h]:mm" ' wenn Dauer als Uhrzeit
End With
With wksData
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Datumswerte in Spalte A kopieren
.Range(.Cells(22, 1), .Cells(Zeile_L, 1)).Copy
wksTaet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'Datumswerte in Spalte F kopieren
.Range(.Cells(22, 6), .Cells(Zeile_L, 6)).Copy
wksTaet.Cells(1, 2).PasteSpecial Paste:=xlPasteValues
'Taetigkeiten in Spalte H kopieren
.Range(.Cells(22, 8), .Cells(Zeile_L, 8)).Copy
wksTaet.Cells(1, 4).PasteSpecial Paste:=xlPasteValues
'Stunden in Spalte K kopieren
.Range(.Cells(22, 11), .Cells(Zeile_L, 11)).Copy
wksTaet.Cells(1, 3).PasteSpecial Paste:=xlPasteValues
End With
With wksTaet
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Daten sortieren
With .Range(.Cells(1, 1), .Cells(Zeile_L, 4))
.Sort Key1:=.Range("A1"), order1:=xlAscending, _
Key2:=.Range("B1"), order2:=xlAscending, _
Key3:=.Range("D1"), order3:=xlAscending, Header:=xlYes
End With
'Tätigkeiten von MA am Datum in jeweils 1. Zeile überragen
For Zeile = 1 To Zeile_L + 1
If varDatum .Cells(Zeile, 1) Or varMA .Cells(Zeile, 2) Then
'1. Zeile, MA-Name und Datum merken wenn Name oder Datum wechselt
Zeile1 = Zeile
varDatum = .Cells(Zeile, 1).Value
varMA = .Cells(Zeile, 2).Value
If Not Zeile = 1 And Zeile Daten vorbereiten: Stelle sicher, dass Deine Daten in einer Excel-Tabelle gut strukturiert sind. Die Spalten sollten die notwendigen Informationen wie Datum, Mitarbeiter und Tätigkeiten enthalten.
Makro erstellen: Öffne den VBA-Editor (ALT + F11) und füge ein neues Modul hinzu. Kopiere den folgenden Code in das Modul:
Sub Taetigkeiten_zusammenfassen()
Dim wksData As Worksheet, wksTaet As Worksheet
Dim Zeile_L As Long
Dim Zeile As Long, Zeile1 As Long, varDatum, varMA, bolDelete As Boolean
Set wksData = ActiveWorkbook.Worksheets("Daten") 'Blattame ggf. anpassen
Set wksTaet = ActiveWorkbook.Worksheets("Tätigkeiten") 'Blattame ggf. anpassen
Application.ScreenUpdating = False
With wksTaet
.UsedRange.ClearContents
.Columns(1).NumberFormat = "DD.MM.YYYY"
End With
With wksData
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
'Datumswerte in Spalte A kopieren
.Range(.Cells(1, 1), .Cells(Zeile_L, 1)).Copy
wksTaet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'Weitere Spalten nach Bedarf kopieren
End With
'Zusammenfassen der Tätigkeiten
'...
Application.ScreenUpdating = True
End Sub
Makro anpassen: Passe den Code an Deine spezifischen Bedürfnisse an, indem Du die Blattnamen und die Spaltenreferenzen entsprechend änderst.
Makro ausführen: Schließe den VBA-Editor und führe das Makro aus (ALT + F8).
Fehler: "Blattname nicht gefunden": Überprüfe, ob die Blattnamen im Code genau mit denen in Deiner Excel-Datei übereinstimmen.
Fehler: "Typenübereinstimmung": Stelle sicher, dass die Daten in den Zellen die richtige Formatierung haben, z.B. Datum als Datum und Zahlen als Zahlen.
Lösung: Überprüfe die Zellformatierung: Verwende die Funktion CDate für Datumswerte oder CDbl für Zahlen, um sicherzustellen, dass die Werte korrekt verarbeitet werden.
Pivot-Tabellen: Wenn Du die Daten nicht unbedingt in einer Zelle konsolidieren möchtest, kannst Du Pivot-Tabellen verwenden. Setze die Felder Datum, Mitarbeiter und Tätigkeit als Zeilenfelder ein. Dies ist besonders nützlich, wenn Du die Anzahl der Tätigkeiten nachverfolgen möchtest.
Formellösungen: Du kannst auch mit Formeln arbeiten, um die Daten zu konsolidieren, erfordert jedoch möglicherweise zusätzliche Hilfsspalten.
Beispiel für Konsolidierung mit Makro:
.Cells(Zeile1, 3).Value = _
.Cells(Zeile1, 3).Value & ";" & .Cells(Zeile, 3).Value
Zusammenfassen von Stunden: Du kannst die Stunden aus einer bestimmten Spalte ebenfalls konsolidieren:
.Cells(Zeile1, 4).Value = .Cells(Zeile1, 4).Value + .Cells(Zeile, 4).Value
Nutze Kontrollkästchen: Füge Kontrollkästchen hinzu, um die Konsolidierungsfunktion optional zu machen. Dies kannst Du über die Entwicklertools in Excel machen.
Optimierung des Makros: Achte darauf, dass die Bildschirmaktualisierung während der Ausführung des Makros deaktiviert ist (Application.ScreenUpdating = False), um die Geschwindigkeit zu verbessern.
Datenvalidierung: Implementiere Datenvalidierung, um sicherzustellen, dass nur korrekte und relevante Daten in die Konsolidierung einfließen.
1. Wie kann ich die Konsolidierung für mehrere Tabellenblätter durchführen?
Du kannst das Makro anpassen, um durch mehrere Tabellenblätter zu iterieren und die Daten in einer neuen Tabelle zu konsolidieren.
2. Was tun, wenn meine Daten nicht korrekt konsolidiert werden?
Überprüfe die Datenformatierung und stelle sicher, dass alle relevanten Werte in den richtigen Spalten stehen.
3. Kann ich auch Text aus mehreren Zeilen in einer Zelle konsolidieren?
Ja, indem Du das Makro entsprechend anpasst, kannst Du mehrere Texte in einer Zelle konsolidieren, wie im Beispiel gezeigt.