Public Function CalculateNonWorkHours(Start As Date, Finish As Date) As Double Dim StartDay As Double, StartTime As Double Dim FinishDay As Double, FinishTime As Double Dim Ret As Double, DayOfWeek As Byte If Finish < Start Then Dim Tmp As Date Tmp = Start Start = Finish Finish = Tmp End If StartDay = Int(Start) StartTime = Round((Start - StartDay) * HoursPerDay, 4) FinishDay = Int(Finish) FinishTime = Round((Finish - FinishDay) * HoursPerDay, 4) Ret = 0 If StartDay = FinishDay Then Ret = Ret + HoursOutsideWorkHours(Weekday(StartDay), StartTime, FinishTime) Else Dim Day As Date, ThisDayStart As Double, ThisDayFinish As Double For Day = StartDay To FinishDay If Day = StartDay Then ThisDayStart = StartTime ThisDayFinish = HoursPerDay ElseIf Day = FinishDay Then ThisDayStart = 0 ThisDayFinish = FinishTime Else ThisDayStart = 0 ThisDayFinish = HoursPerDay End If Ret = Ret + HoursOutsideWorkHours(Weekday(Day), ThisDayStart, ThisDayFinish) Next End If CalculateNonWorkHours = Ret End Function Private Function HoursOutsideWorkHours(Weekday As VbDayOfWeek, Start As Double, Finish As Double) As Double Dim Ret As Double Ret = 0 Select Case Weekday Case vbSunday, vbSaturday ' or national public holiday... Ret = Ret + (Finish - Start) Case Else If Start < WorkDayStart Then Ret = Ret + (WorkDayStart - Start) End If If Finish > WorkDayFinish Then Ret = Ret + (Finish - WorkDayFinish) End If End Select HoursOutsideWorkHours = Ret End Function