Excel:vba时间计算

时间:2014-01-18 02:41:10

标签: excel vba excel-vba user-defined-functions

我有一个电子表格,用于计算我部门的报道。

一张(Sheet1)有休息和午餐数据以及换班的关键字:

sheet1

在Sheet2上,我有一行时间,以及一个带有移位的列。

我想制作一个UDF,或者只是使用一个公式,如果可能的话,在某些条件下自动添加1或.5。以下是我的时间排列方式:

sheet2

我想创建一个公式或者很可能是一个UDF,它会在当前时间符合标准的情况下自动查找,如果不满足标准则放置1或.5或者没有。

以下是1:
的标准 时间(00:00)必须在班次中,如果班次在(00:30)结束,那么(00:30)将有0;
如果有休息,那么半小时的时间应该是.5;所有午餐都是30分钟,所以如果有一个时间的午餐(04:30)那么(04:30)应该是0或空白;

2 个答案:

答案 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