簡體   English   中英

計算加班時間不一致的公式

[英]Formula to calculate overtime hours not working consistently

編輯:在注釋中實施Vincent解決方案后,現在可以計算加班時間

我的女朋友每天在家工作6個小時,就可以自己做幾個小時。 她要求我為她制作一個時間表,以便她可以輸入自己的開始時間和結束時間,並自動計算出她的工作時間。 它計算出總工作時間沒有問題(只要他們不經過午夜),但我也想讓它跟蹤她的加班時間。

我有一個應該起作用的公式,但是問題是,如果給定日期的所有開始時間和結束時間都是上午或下午,那么無論總小時數超過6小時,它都不會計算加班時間。 但是,只要輸入一個從AM時間開始到PM時間結束的時間值(例如11:00到14:00),它就會計算出當天的總加班小時數。

這是時間表的屏幕快照,其中輸入的時間總計超過6小時,但開始時間和結束時間從AM到PM都沒有: 不好的結果

這是一個示例,其中現在第一天輸入的最后時間從上午時間變為下午時間。 請注意,現在正在准確計算加班時間。 好的結果

VBA生成用於計算小時數的公式,如下所示:

Sub calcHours(ByVal numDays As Integer)
    Dim newWeekRow As Integer: newWeekRow = 0

    With Sheets("timesheet")
        'Add the formula to calculate hours for the day
        Range(Cells(5, 17), Cells(numDays + 4, 17)).FormulaR1C1 = _
        "=SUM((RC[-2] - RC[-3]) + (RC[-4] - RC[-5]) + (RC[-6] - RC[-7]) + (RC[-8] - RC[-9]) + (RC[-10] - RC[-11]) + (RC[-12] - RC[-13]))"

        'Add formula to calculate overtime hours
        Range(Cells(5, 19), Cells(numDays + 4, 19)).FormulaR1C1 = _
        "=IF(RC[-2]-(6/24) > 6/24, RC[-2]-(6/24), 0)"

        'Add the formula to calculate hours for the week
        For ctr = 1 To numDays
            If (Cells(4 + ctr, 2).Value = "Saturday") Then 'found the end of the week
                If (newWeekRow = 0) Then 'end of the first week
                    Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R5C[-1]:RC[-1])"
                    newWeekRow = 4 + ctr
                Else
                    Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R[-6]C[-1]:RC[-1])"
                    newWeekRow = 4 + ctr
                End If
            End If

            If (ctr = numDays) Then 'reached the end of the last week
                Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R" & newWeekRow + 1 & "C[-1]:RC[-1])"
            End If
        Next ctr

        'Add formula to calulate total hours for the month
        With Cells(5 + numDays, 17)
            .FormulaR1C1 = "=SUM(R[-" & numDays & "]C:R[-1]C)"
            .Font.Bold = True
        End With
    End With
End Sub

當前,您匯總一周中小時的公式基本上是:

=SUM(E5-D5,G5-F5,I5-H5,K5-J5,M5-L5, O5-N5)

問題是,當您經過午夜時,您將無法指示時間是第二天。 由於時間存儲為小數,日期存儲為整數,默認情況下,當僅輸入時間時,0是一天的整數。 您需要做的就是在超時時間小於輸入時間的時間加1。 稍微作弊,假設進出之間的時間間隔不會超過24小時。 因此,請記住這一點,並在通過數學運算符時將布爾True和False分別轉換為1和0,您可以按以下方式調整公式:

=SUM(E5+(E5<D5)-D5,G5+(G5<F5)-F5,I5+(I5<H5)-H5,K5+(K5<J5)-J5,M5+(M5<L5)-L5, O5+(O5<N5)-N5)

另外,您可以記錄工作的當天時間,而不是您整夜睡眠的時間作為當天的工作時間。 即,如果您從星期一的2300工作到星期二的0100,則將星期一記錄為2300中的時間,超時為23:59,將星期二記錄為00:00,將超時記錄為01:01。 注意超時增加了1分鍾。 這是為了彌補23:59到24:00之間丟失的分鍾(技術上在excel中不存在,但可以執行某些操作)

至於加班費的計算,請參見Vincent G的評論。 該公式的另一個旋轉可能是:

=MAX(Q5-6/24,0)

POC

您將需要更改單元格引用以匹配您的VBA編程需求。 這兩個公式都可以正確計算加班時間,以及午夜的開始時間和結束時間。

首先,如果您午夜過后,這是我會做的:

午夜過后意味着小時數將是負數。 在這種情況下,請執行IF語句,如果結果為負數,只需在結果中加上24小時(或1天)即可。

其次,您是否不能僅通過從一天的總工作時間中減去6小時來計算沒有VBA的加班時間? 我對VBA不太熟悉,所以如果我遺漏了一些明顯的東西,請原諒我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM