Thema Datum  Von Nutzer Rating
Antwort
Rot Arbeitszeiten kontrollieren
13.08.2024 12:07:22 Hady
NotSolved
13.08.2024 12:59:31 Gast7777
NotSolved
13.08.2024 19:09:16 ralf_b
NotSolved

Ansicht des Beitrags:
Von:
Hady
Datum:
13.08.2024 12:07:22
Views:
428
Rating: Antwort:
  Ja
Thema:
Arbeitszeiten kontrollieren

Hallo Zusammen,

In zelle 13,3 steht eine Stundenzahl für die tägliche Arbeitszeit. In Spalte A ab zeile 19 im Blatt Main stehen Namen. Ab Spalte 8 Zeile 18 stehen daten für einen Monat. Für jeden Tag und jede Person können Startuhrzeiten wie z.B. 07:00 eingetragen sein. Dann beträgt die Enduhrzeit 07:00 Uhr + Wert aus 13,3, was eine Arbeitszeit von Wert aus 13,3 ergibt. Es kann aber auch ein Zeitraum angegeben sein z.B. 10:00-12:00, was einer Arbeitszeit von 2h ergibt. Es soll nun überprüft werden, ob für eine Person aus Spalte A für gleiche Daten aus Zeile 18 die tägliche Arbeitszeit aus Zelle 13,3 überschritten wurde, wenn also an einem Datum mehrere Zeiten oder Zeiträume und damit die Summe der einzelnen Zeitdifferenzen die tägliche Arbeitszeit überschreitet.

Mein Ansatz:


Sub CheckAndMarkOvertime()
    Dim ws As Worksheet
    Dim nameRange As Range
    Dim dailyHours As Double
    Dim totalWorkHours As Double
    Dim startTime As Date, endTime As Date
    Dim timeDifference As Double
    Dim timeParts() As String
    Dim personName As String
    Dim lastRow As Long, lastCol As Long
    Dim firstRow As Long, firstCol As Long
    Dim cellToCheck As Range
    Dim dateCol As Long
    Dim personRow As Long
    Dim dateRange As Range
    Dim currentDateCell As Range
    Dim personDict As Object
    Dim currentCell As Range
    Dim hoursSum As Double
    Dim i As Long

    ' Set the worksheet
    Set ws = ThisWorkbook.Sheets("Main")

    ' Daily working hours
    dailyHours = ws.Cells(13, 3).value

    ' Determine the last row and column with data
    With ws.UsedRange
        lastRow = .Rows(.Rows.count).Row
        lastCol = .Columns(.Columns.count).Column
    End With

    ' Determine the first row and column for the data range
    firstRow = 19
    firstCol = 8

    ' Set the range to be colored white
    ws.Range(ws.Cells(firstRow, firstCol), ws.Cells(lastRow, lastCol)).Interior.Color = RGB(255, 255, 255)
    
    ' Define the range for names
    Set nameRange = ws.Range("A" & firstRow & ":A" & ws.Cells(ws.Rows.count, 1).End(xlUp).Row)
    
    ' Iterate through each date column
    For dateCol = 1 To (lastCol - firstCol + 1)
        ' Define the range for the current date column
        Set dateRange = ws.Range(ws.Cells(firstRow, firstCol + dateCol - 1), ws.Cells(lastRow, firstCol + dateCol - 1))

        ' Iterate through each row in the name column
        For personRow = firstRow To ws.Cells(ws.Rows.count, 1).End(xlUp).Row
            personName = ws.Cells(personRow, 1).value
            totalWorkHours = 0

            ' Create a dictionary to track the total work hours for this person on this date
            Set personDict = CreateObject("Scripting.Dictionary")
            
            ' Iterate through each cell in the date column for the current person
            For Each cellToCheck In dateRange
                If cellToCheck.Row = personRow Then
                    If cellToCheck.value <> "" Then
                        If InStr(cellToCheck.value, "-") > 0 Then
                            ' Time range
                            timeParts = Split(cellToCheck.value, "-")
                            startTime = CDate(timeParts(0))
                            endTime = CDate(timeParts(1))
                            timeDifference = (endTime - startTime) * 24 ' Convert to hours
                        Else
                            ' Single start time
                            startTime = CDate(cellToCheck.value)
                            endTime = DateAdd("h", dailyHours, startTime)
                            timeDifference = (endTime - startTime) * 24 ' Convert to hours
                        End If
                        
                        totalWorkHours = totalWorkHours + timeDifference
                    End If
                End If
            Next cellToCheck
            
            ' Add total work hours to the dictionary
            personDict(personName) = totalWorkHours
        Next personRow
        
        ' After processing all persons for this date, mark the cells for the date if any person exceeded the daily hours
        For Each currentCell In dateRange
            personName = ws.Cells(currentCell.Row, 1).value
            If personDict.exists(personName) Then
                If personDict(personName) > dailyHours Then
                    ws.Cells(currentCell.Row, firstCol + dateCol - 1).Interior.Color = RGB(255, 255, 0)
                End If
            End If
        Next currentCell
    Next dateCol
End Sub

Leider weiß ich nicht wie ich ein Bild einfügen kann, um das Problem verständlich zu beschreiben. Der Code läuft ohne Probleme durch, er findet allerdings nicht die richtigen Daten und markiert die Zellen für die jeweiligen personen, für die die tägliche Arbeitszeit überschritten wurde.

Vielen Dank


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:

 
 

  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Arbeitszeiten kontrollieren
13.08.2024 12:07:22 Hady
NotSolved
13.08.2024 12:59:31 Gast7777
NotSolved
13.08.2024 19:09:16 ralf_b
NotSolved