Normaleweise ist das mittels Pivot-Tabelle mit eine paar Klicks erledigt; da bedarf es kein VBA dazu.
Da du aber nach einem VBA Ansatz gefragt hast, siehe unten...
Problem:
Funktion zur Auslesung der Monatsstunden pro Person, die in einem Monat mehrmals auftauchen kann.
Ganz unkompliziert eine Funktion dafür schreiben. Als Beispiel unten (Example) wird dessen Verwendung für das Tabellenblatt "Januar" demonstriert.
GetTotalHours geht in Spalte A alle Zeilen durch und merkt sich jeweils Name und Stunden in einem Dictionary. Der Name ist dabei der Schlüssel und der darunter gespeicherte Wert die Stunden; letztere werden aufsummiert.
Diese Funktion kann für alle Monate verwendet werden. Aus allen gesammelten Inforamtionen kann man dann die Gesamtstunden (Jahr) errechnen und auf dem Übersichtsblatt eintragen.
Grüße
' Modul: modTotalHours
Option Explicit
Public Sub Example()
Dim wks As Excel.Worksheet
Dim objResult As Object
Set wks = ThisWorkbook.Worksheets("Januar") ' << Namen ggf. anpassen
If GetTotalHours(wks, objResult) > 0 Then
'weitere Verarbeitung / Ausgabe von objResult (nur als Beispiel)
GoSub DebugPrintTotalHours
End If
Exit Sub
' Lokale Hilfsfunktion für Ausgabe im Direktfenster
' (STRG+G bzw. VBA Editor > Ansicht > Direktfenster)
DebugPrintTotalHours:
Dim vntPerson As Variant
Debug.Print "['"; wks.Name; "']"
For Each vntPerson In objResult.Keys
Debug.Print " * '"; vntPerson; "':"; Tab(25); CStr(objResult(vntPerson)); " hours"
Next
Return
End Sub
Public Function GetTotalHours(ByVal MonthWorksheet As Excel.Worksheet, ByRef TotalHoursByPerson As Object) As Long
Const C_FIRST_ROW As Long = 2
Dim objDic As Object
Dim rngRow As Excel.Range
Dim strFullName As String
Set objDic = CreateObject("Scripting.Dictionary")
objDic.CompareMode = VbCompareMethod.vbTextCompare
With MonthWorksheet
For Each rngRow In .Range(.Cells(C_FIRST_ROW, "A"), .Cells(.Rows.Count, "A").End(xlUp))
strFullName = Trim$(.Cells(rngRow.Row, "A").Value)
If Len(strFullName) > 0 Then
objDic(strFullName) = CDbl(objDic(strFullName)) + CDbl(.Cells(rngRow.Row, "J").Value)
End If
Next
End With
Set TotalHoursByPerson = objDic
GetTotalHours = TotalHoursByPerson.Count
End Function
|