编辑:在注释中实施Vincent解决方案后,现在可以计算加班时间
我的女朋友每天在家工作6个小时,就可以自己做几个小时。她要求我为她制作一个时间表,以便她可以输入自己的开始时间和结束时间,并自动计算出她的工作时间。它计算出总工作时间没有问题(只要他们不经过午夜),但我也想让它跟踪她的加班时间。
我有一个应该起作用的公式,但是问题是,如果给定日期的所有开始时间和结束时间都是上午或下午,那么无论总小时数超过6,它都不会计算加班时间小时。但是,只要输入一个从AM时间开始到PM时间结束的时间值(例如11:00到14:00),它就会计算出当天的总加班小时数。
以下是时间表的屏幕快照,其中输入的时间总计超过6小时,但开始时间和结束时间从上午到下午都没有:
在此示例中,现在第一天输入的最后时间从上午时间变为下午时间。请注意,现在正在准确计算加班时间。
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
答案 0 :(得分:1)
当前,您计算一周中小时数的公式基本上是:
=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)
您将需要更改单元格引用以匹配您的VBA编程需求。这两个公式都可以正确计算加班时间,并且可以在午夜开始和结束时间。
答案 1 :(得分:1)
首先,如果您午夜过后,这就是我要做的事情:
经过午夜意味着小时数将是负数。在这种情况下,请执行IF语句,如果结果为负数,只需在结果中加上24小时(或1天)即可。
第二,您不能通过仅从一天的总工作时间中减去6小时来计算没有VBA的加班吗? 我对VBA不太熟悉,所以如果我遗漏了一些明显的东西,请原谅我。