我有一个电子表格,用于计算我部门的报道。
一张(Sheet1)有休息和午餐数据以及换班的关键字:
在Sheet2上,我有一行时间,以及一个带有移位的列。
我想制作一个UDF,或者只是使用一个公式,如果可能的话,在某些条件下自动添加1或.5。以下是我的时间排列方式:
我想创建一个公式或者很可能是一个UDF,它会在当前时间符合标准的情况下自动查找,如果不满足标准则放置1或.5或者没有。
以下是1:
的标准
时间(00:00)必须在班次中,如果班次在(00:30)结束,那么(00:30)将有0;
如果有休息,那么半小时的时间应该是.5;所有午餐都是30分钟,所以如果有一个时间的午餐(04:30)那么(04:30)应该是0或空白;
答案 0 :(得分:1)
我认为虽然可以使用公式,但公式会很大且不实用。 UDF将更容易创建和维护。
试试这个
Function WorkTime(Breaks As Range, Shift As Variant, CurTime As Date) As Variant
Dim Lunch As Date
Dim Break1 As Date
Dim Break2 As Date
Dim v As Variant
Dim BreakTime As Long
With Application
v = .Match(Shift, Breaks.Columns(1), 0)
Lunch = .Index(Breaks.Columns(3), v)
Break1 = .Index(Breaks.Columns(2), v)
Break2 = .Index(Breaks.Columns(4), v)
End With
v = DateDiff("n", CurTime, Lunch)
Select Case v
Case -30 To 0
BreakTime = 30 + v
Case 0 To 30
BreakTime = 30 - v
End Select
v = DateDiff("n", CurTime, Break1)
Select Case v
Case -15 To 0
BreakTime = BreakTime + 15 + v
Case 0 To 15
BreakTime = BreakTime + v
Case 15 To 30
BreakTime = BreakTime + 30 - v
End Select
v = DateDiff("n", CurTime, Break2)
Select Case v
Case -15 To 0
BreakTime = BreakTime + 15 + v
Case 0 To 15
BreakTime = BreakTime + v
Case 15 To 30
BreakTime = BreakTime + 30 - v
End Select
WorkTime = 1# - BreakTime / 30#
End Function
答案 1 :(得分:0)
感谢大家的回复。这确实帮助我节省了工作时间。 :)
chris neilsen - 这正是我想要的。这是我添加的代码,用于检查人员是否班次。 :)
Dim WholeShift() As String
WholeShift = Split(Shift, "-")
For i = LBound(WholeShift) To UBound(WholeShift)
WholeShift(i) = Trim(WholeShift(i))
If Len(WholeShift(i)) = 3 Then
WholeShift(i) = 0 & WholeShift(i)
End If
Next
If DateDiff("n", CDate(Left(WholeShift(0), 2) & ":" & Right(WholeShift(0), 2)), CurTime) > 0 Or DateDiff("n", CDate(Left(WholeShift(1), 2) & ":" & Right(WholeShift(1), 2)), CurTime) <= 0 Then
CalcShiftCoverage = 0
Exit Function
End If