有效工作时长计算

微信公众号原文

系统:Windows 7
软件:Excel 2010

使用场景or困惑

  • 已知一件工作的开始时间和结束时间,求解工作了多少小时?
  • 不考虑一天中的非工作时间,例如午休时间

示例:求解工作时长
1.png

思考

  1. 考虑通用性,一天中的工作时间可以调整并且增加分段,例如由原来的两班次变成三班次
  2. 每一整天中工作时长是一致的,那么我们只需要计算开始那一天和结束那一天的工作时长,再加上中间完整天的工作时长即可
  3. 两个核心概念
    • 单天中工作时长计算
      • 单天结束时间为:23:59:59
      • 单天开始时间为:00:00:00
    • 一整天工作时长计算

代码框架

  1. 过程main:主过程,循环每一行,写入工作时长进工作表
  2. 函数get_work_time:求解每一行的工作时长
  3. 函数get_part_day:求解非完整天工作时长
  4. 函数get_entire_day:求解完整一天工作时长

代码

过程main

Sub main()
    Set sht = ThisWorkbook.Worksheets("示例")
    max_row = sht.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To max_row Step 1
        start_time = sht.Cells(i, "A")
        end_time = sht.Cells(i, "B")
        work_time = get_work_time(start_time, end_time)
        sht.Cells(i, "C") = work_time
    Next i
End Sub

代码截图
main.png

函数get_work_time

Function get_work_time(start_time, end_time)
    date_time_start = CDate(start_time)
    date_time_end = CDate(end_time)

    date_start = DateSerial(Year(date_time_start), Month(date_time_start), Day(date_time_start))
    date_end = DateSerial(Year(date_time_end), Month(date_time_end), Day(date_time_end))
    day_i = DateDiff("d", start_time, end_time)

    time_start = CDate(FormatDateTime(date_time_start, 4))
    time_end = CDate(FormatDateTime(date_time_end, 4))

    If day_i = 0 Then
        time_start_use = time_start
        time_end_use = time_end

        hour_ = get_part_day(time_start_use, time_end_use)
    ElseIf day_i = 1 Then
        time_start_use = time_start
        time_end_use = CDate("23:59:59")
        hour_1 = get_part_day(time_start_use, time_end_use)

        time_start_use = CDate("00:00:00")
        time_end_use = CDate(time_end)
        hour_2 = get_part_day(time_start_use, time_end_use)

        hour_ = hour_1 + hour_2
    Else
        time_start_use = time_start
        time_end_use = CDate("23:59:59")
        hour_1 = get_part_day(time_start_use, time_end_use)

        time_start_use = CDate("00:00:00")
        time_end_use = CDate(time_end)
        hour_2 = get_part_day(time_start_use, time_end_use)

        whole_day_work = get_entire_day()
        hour_3 = (day_i - 1) * whole_day_work

        hour_ = hour_1 + hour_2 + hour_3
    End If

    get_work_time = hour_

End Function

代码截图
get_work_time.png

函数get_part_day

Function get_part_day(time_start_use, time_end_use)
    Rem>>
    Rem>>
    Set sht = ThisWorkbook.Worksheets("示例")
    max_row = sht.Cells(Rows.Count, "F").End(xlUp).Row

    time_total = 0

    For i = 2 To max_row Step 1
        start_time = CDate(sht.Cells(i, "F"))
        end_time = CDate(sht.Cells(i, "G"))
        If time_start_use > start_time Then
            time_start = time_start_use
        Else
            time_start = start_time
        End If

        If time_end_use < end_time Then
            time_end = time_end_use
        Else
            time_end = end_time
        End If

        If time_start > time_end Then
            hour_i = 0
        Else
            time_i = DateDiff("s", time_start, time_end)
            hour_i = Round(time_i / 3600, 2)
        End If

        time_total = time_total + hour_i

    Next i

    get_part_day = time_total

End Function

代码截图
get_part_day.png

函数get_entire_day

Function get_entire_day()
    Rem>>
    Rem>>
    Set sht = ThisWorkbook.Worksheets("示例")
    max_row = sht.Cells(Rows.Count, "F").End(xlUp).Row

    time_total = 0
    For i = 2 To max_row Step 1
        start_time = CDate(sht.Cells(i, "F"))
        end_time = CDate(sht.Cells(i, "G"))
        time_i = DateDiff("s", start_time, end_time)
        hour_i = Round(time_i / 3600, 2)
        time_total = time_total + hour_i
    Next i

    get_entire_day = time_total
End Function

代码截图

get_entire_day.png

执行结果
2.png

部分代码解读

  1. time_i = DateDiff("s", start_time, end_time)计算两段的时间差

以上为本次的学习内容,下回见

更多精彩,请关注微信公众号
扫描二维码,关注本公众号

公众号底部二维码.jpg

猜你喜欢

转载自blog.csdn.net/fourseasonbeans/article/details/80543342