Option Explicit
Function dShiftHrs(rngStartTime As Range, rngEndTime As Range) As Double
Dim StartTime As Double
Dim EndTime As Double
Dim ShiftHours
Const DaytStart As Double = 0.270833333
Const NightStart As Double = 0.770833334
StartTime = rngStartTime - Int(rngStartTime)
EndTime = rngEndTime - Int(rngEndTime)
If Int(rngStartTime) = Int(rngEndTime) Then ' all hours in same day
If StartTime >= NightStart Then 'all night shift do nothing
ElseIf EndTime < DaytStart Then 'all night shift do nothing
ElseIf StartTime >= DaytStart And EndTime <= NightStart Then 'all day shift
dShiftHrs = EndTime - StartTime
ElseIf StartTime >= DaytStart And EndTime > NightStart Then 'day shift and night shift
dShiftHrs = NightStart - StartTime 'day shift hours
ElseIf StartTime < DaytStart And EndTime < NightStart Then 'night shift and day shift
dShiftHrs = EndTime - DaytStart
ElseIf StartTime < DaytStart And EndTime > NightStart Then 'Night Shift, DayShift, Night Shift
dShiftHrs = 0.5
End If
Else 'hours in two days
If StartTime > NightStart And EndTime < DaytStart Then 'all night shift do nothing
ElseIf StartTime > NightStart And EndTime > DaytStart And EndTime < NightStart Then 'night shift day shift
dShiftHrs = EndTime - DaytStart
ElseIf StartTime > NightStart And EndTime > NightStart Then 'night shift, day shift, night shift
dShiftHrs = 0.5
ElseIf StartTime < NightStart And StartTime > DaytStart And EndTime < DaytStart Then 'day shift, night shift, night shift
dShiftHrs = NightStart - StartTime
ElseIf StartTime < NightStart And StartTime > DaytStart And EndTime < NightStart Then 'day shift, night shift, night shift
dShiftHrs = NightStart - StartTime + EndTime - DaytStart
ElseIf StartTime < DaytStart And EndTime > NightStart Then 'night shift, day shift, night shift, night shift,day shift,night shift
dShiftHrs = 0.99999
ElseIf StartTime < DaytStart And EndTime > DaytStart And EndTime < NightStart Then 'night shift, day shift, night shift, night shift,day shift
dShiftHrs = 0.5 + EndTime - DaytStart
ElseIf StartTime < NightStart And EndTime > NightStart Then 'day shift, night shift, night shift,day shift,night shift
dShiftHrs = NightStart - StartTime + 0.5
ElseIf StartTime < DaytStart And EndTime < DaytStart Then 'night shift, day shift, night shift, night shift
dShiftHrs = 0.5
End If
End If
End Function
Function nShiftHrs(rngStartTime As Range, rngEndTime As Range) As Double
Dim StartTime As Double
Dim EndTime As Double
Dim ShiftHours
Const DaytStart As Double = 0.270833333
Const NightStart As Double = 0.770833334
StartTime = rngStartTime - Int(rngStartTime)
EndTime = rngEndTime - Int(rngEndTime)
If Int(rngStartTime) = Int(rngEndTime) Then ' all hours in same day
If StartTime >= NightStart Then 'all night shift
nShiftHrs = EndTime - StartTime
ElseIf EndTime < DaytStart Then 'all night shift
nShiftHrs = EndTime - StartTime
ElseIf StartTime >= DaytStart And EndTime <= NightStart Then 'all day shift do nothing
ElseIf StartTime >= DaytStart And EndTime > NightStart Then 'day shift and night shift
nShiftHrs = EndTime - NightStart 'night shift hours
ElseIf StartTime < DaytStart And EndTime < NightStart Then 'night shift and day shift
nShiftHrs = DaytStart - StartTime
ElseIf StartTime < DaytStart And EndTime > NightStart Then 'Night Shift, DayShift, Night Shift
nShiftHrs = DaytStart - StartTime + EndTime - NightStart
End If
Else 'hours in two days
If StartTime > NightStart And EndTime < DaytStart Then 'all night shift
nShiftHrs = 1 - StartTime + EndTime
ElseIf StartTime > NightStart And EndTime > DaytStart And EndTime < NightStart Then 'night shift day shift
nShiftHrs = 1 - StartTime + DaytStart
ElseIf StartTime > NightStart And EndTime > NightStart Then 'night shift, day shift, night shift
nShiftHrs = 1 - StartTime + DaytStart + EndTime - NightStart
ElseIf StartTime < NightStart And StartTime > DaytStart And EndTime < DaytStart Then 'day shift, night shift, night shift
nShiftHrs = 1 - NightStart + EndTime
ElseIf StartTime < NightStart And StartTime > DaytStart And EndTime < NightStart Then 'day shift, night shift, night shift
nShiftHrs = 0.5
ElseIf StartTime < DaytStart And EndTime > NightStart Then 'night shift, day shift, night shift, night shift,day shift,night shift
nShiftHrs = DaytStart - StartTime + 0.5 + EndTime - NightStart
ElseIf StartTime < DaytStart And EndTime > DaytStart And EndTime < NightStart Then 'night shift, day shift, night shift, night shift,day shift
nShiftHrs = DaytStart - StartTime + 0.5
ElseIf StartTime < NightStart And EndTime > NightStart Then 'day shift, night shift, night shift,day shift,night shift
nShiftHrs = 1 - NightStart + DaytStart + EndTime - NightStart
ElseIf StartTime < DaytStart And EndTime < DaytStart Then 'night shift, day shift, night shift, night shift
nShiftHrs = DaytStart - StartTime + 1 - NightStart + EndTime
End If
End If
End Function