VBA有效工时计算

心不动则不痛 提交于 2020-08-13 20:43:52
Type ClassInfo
    start_time As String
    core_start_time As String
    end_time As String
    noon_break_start_time As String
    noon_break_end_time As String
    evening_break_end_time As String
End Type

Private Function get_class_info(class As Integer) As ClassInfo
    '获取班次信息
    Dim class_info As ClassInfo
    
    Select Case class
    Case 0
        class_info.start_time = "08:30:00"
        class_info.core_start_time = "09:30:00"
        class_info.end_time = "18:00:00"
        class_info.noon_break_start_time = "12:00:00"
        class_info.noon_break_end_time = "13:30:00"
        class_info.evening_break_end_time = "18:30:00"
    Case 1
        class_info.start_time = "08:00:00"
        class_info.core_start_time = "09:00:00"
        class_info.end_time = "17:30:00"
        class_info.noon_break_start_time = "12:00:00"
        class_info.noon_break_end_time = "13:30:00"
        class_info.evening_break_end_time = "18:00:00"
    End Select

    get_class_info = class_info
End Function

Public Function vaild_work_hours(start_time, end_time, Optional class As Integer = 0) As Double
    '计算给定时间段的有效工作时间
    'start_time 起始时间
    'end_time 结束时间
    'class 班次,默认0班次为8:30-18:00, 1班次为8:00-17:30
    
    If Not (Len(start_time) > 0 And Len(end_time) > 0) Then
        vaild_work_hours = 0
        Exit Function
    End If
    
    If InStr(start_time, ":") > 0 Then
        start_time = get_time_value(start_time)
    End If
    
    If InStr(end_time, ":") > 0 Then
        end_time = get_time_value(end_time)
    End If
    
    If start_time > 1 Then
        start_time = start_time - Int(start_time)
    End If
    
    If end_time > 1 Then
        end_time = end_time - Int(end_time)
    End If
    
    
    Dim class_info As ClassInfo
    class_info = get_class_info(class)
    
    Dim work_hours As Double  '有效工作时间
    work_hours = 0
    If start_time > end_time Then
        '跨天的额外工作时间
        work_hours = end_time
        end_time = 1
    End If
    
    work_hours = work_hours + calc_overlay_time(start_time, end_time, get_time_value(class_info.start_time), get_time_value(class_info.noon_break_start_time))
    work_hours = work_hours + calc_overlay_time(start_time, end_time, get_time_value(class_info.noon_break_end_time), get_time_value(class_info.end_time))
    work_hours = work_hours + calc_overlay_time(start_time, end_time, get_time_value(class_info.evening_break_end_time), 1)
    
    vaild_work_hours = Round(work_hours * 24, 2)

End Function

Private Function calc_overlay_time(start_time1, end_time1, start_time2, end_time2) As Double
    '计算两个时间段重叠的时间
    calc_overlay_time = WorksheetFunction.Max(0, WorksheetFunction.Min(end_time1, end_time2) - WorksheetFunction.Max(start_time1, start_time2))
End Function
Private Function get_time_value(ByVal time As String) As Double
    get_time_value = Evaluate("TIMEVALUE(""" & time & """)")
End Function
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!