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
来源:oschina
链接:https://my.oschina.net/fgq611/blog/4273760