VBA公式来计算工作时间

时间:2019-11-14 19:38:55

标签: excel vba calculation

我仍然在VBA中掌握更复杂的公式。

我想创建一个可以计算某些项目的工作时间的系统。例如,假设我的上班时间是6 AM-330PM。我在11/14的7AM开始一个项目,在11/16的9AM结束它。

我将如何进行计算,以便返回的值将是我每天工作的小时数,而不是24小时的滚动计算? (如果可能,还跳过周末吗?)

谢谢!!这是我试图使用的代码。...

Public Function NetWorkHours(dteStart As Date, dteEnd As Date) As Integer
Dim StDate As Date
Dim StDateD As Date
Dim StDateT As Date
Dim EnDate As Date
Dim EnDateD As Date
Dim EnDateT As Date
Dim WorkDay1Start As Date
Dim WorkDay1end As Date
Dim WorkDay2Start As Date
Dim WorkDay2end As Date
Dim Result As Integer
Dim MinDay As Integer

StDate = CDate(dteStart)
EnDate = CDate(dteEnd)

WorkDay1Start = DateValue(StDate) + TimeValue("08:00:00")
WorkDay1end = DateValue(StDate) + TimeValue("17:00:00")
WorkDay2Start = DateValue(EnDate) + TimeValue("08:00:00")
WorkDay2end = DateValue(EnDate) + TimeValue("17:00:00")

If (StDate > WorkDay1end) Then
    StDate = DateAdd("d", 1, WorkDay1Start)
End If
If (StDate < WorkDay1Start) Then
    StDate = WorkDay1Start
End If

If (EnDate > WorkDay2end) Then
    EnDate = DateAdd("d", 1, WorkDay2Start)
End If
If (EnDate < WorkDay2Start) Then
    EnDate = WorkDay2Start
End If

StDateD = CDate(Format(StDate, "Short Date"))
EnDateD = CDate(Format(EnDate, "Short Date"))

If StDateD = EnDateD Then
  Result = DateDiff("n", StDate, EnDate, vbUseSystemDayOfWeek)
Else
    MinDay = (8 * 60) 'Number of minutes of a working day. Change this if you change the start and end times.

    'Extract the time from the two timestamps
    StDateT = Format(StDate, "Short Time")
    EnDateT = Format(EnDate, "Short Time")

'         “计算第一天和第二天的分钟数。如果开始时间是下午5点之后或结束时间是8am之前,不知道该怎么办         结果= DateDiff(“ n”,StDateT,TimeValue(“ 17:00:00”),vbUseSystemDayOfWeek)         结果=结果+ DateDiff(“ n”,TimeValue(“ 08:00:00”),EnDateT,vbUseSystemDayOfWeek)         '检查这两天是否休息。         如果DateDiff(“ n”,StDateT,TimeValue(“ 17:00:00”),vbUseSystemDayOfWeek)>(5 * 60)然后             结果=结果-60         如果结束

    If DateDiff("n", TimeValue("08:00:00"), EnDateT, vbUseSystemDayOfWeek) > (5 * 60) Then
        Result = Result - 60
    End If

    'Add 1 day to start date. This is to start the loop to get all the days between both dates.
    StDateD = DateAdd("d", 1, StDateD)

    Do Until StDateD = EnDateD
        'If the date is not a saterday or a sunday we add one day.
        If (Weekday(StDateD) > 1) And (Weekday(StDateD) < 7) Then
            Result = Result + MinDay
            'Check for the holiday. If the date is a holiday, then we remove one day
            If Not IsNull(DLookup("[HolDate]", "Holidays", "[HolDate] = #" & Int(StDateD) & "#")) Then
              Result = Result - MinDay
            End If
      End If
      StDateD = DateAdd("d", 1, StDateD)
    Loop
End If
NetWorkHours = Result

结束功能

1 个答案:

答案 0 :(得分:1)

您可以使用DateDiff计算日期(和时间)之间的时差。以下内容将使您非常接近想要做的事情:

Dim datStart As Date
Dim datEnd As Date

Dim sngShiftStart As Single
Dim sngShiftEnd As Single
Dim sngShiftDuration As Single

Dim lngMinutesWorked As Long
Dim lngOfftime As Long
Dim sngHoursWorked As Single

' Calculate shift length
sngShiftStart = 6
sngShiftEnd = 15.5
sngShiftDuration = sngShiftEnd - sngShiftStart

' Set start and end times
datStart = CDate("11/07/19 7:00")
datEnd = CDate("11/09/19 8:30")

lngMinutesWorked = DateDiff("n", datStart, datEnd)
lngOfftime = ((24 - sngShiftDuration) * 60) * (DateDiff("d", datStart, datEnd))

sngHoursWorked = (lngMinutesWorked - lngOfftime) / 60
MsgBox sngHoursWorked

这不考虑周末,但您应该可以轻松添加。您可以使用Weekday function检查开始日期的工作日是否小于结束日期。在这种情况下,请从2 * sngShiftDuration中减去sngHoursWorked。如果您的项目持续一周以上,则可以查找并减去更多的周末:

' Remove weekends
Dim sngWeekendHours As Single

If Weekday(datStart) > Weekday(datEnd) Then
    ' Weekend included
    sngWeekendHours = (2 * sngShiftDuration) * (DateDiff("w", datStart, datEnd) + 1)
End If

sngHoursWorked = ((lngMinutesWorked - lngOfftime) / 60) - sngWeekendHours