トップへ(mam-mam.net/)

残業、深夜残業、通常時間を求める

検索:

「残業、深夜残業、通常時間を求める」

残業、深夜残業、通常時間を求める

回答

以下参照

ソース

Option Explicit
'******************************************
'*Copyright 2010 mam                      *
'*この関数は 残業を計算します             *
'******************************************

'5:00-8:00   A
'800-18:00   B
'18:00-22:00 A
'22:00-5:00  C

Function zanA(開始時間 As Date, 終了時間 As Date) As Date
  zanA = TimeSerial(0, 0, 0)
  If 開始時間 > 終了時間 Then
    終了時間 = 終了時間 + 1
  End If
  
  zanA = zanA + 間の時間を計算(TimeSerial(5, 0, 0), TimeSerial(8, 0, 0), 開始時間, 終了時間)
  zanA = zanA + 間の時間を計算(TimeSerial(18, 0, 0), TimeSerial(22, 0, 0), 開始時間, 終了時間)
  zanA = zanA + 間の時間を計算(TimeSerial(29, 0, 0), TimeSerial(32, 0, 0), 開始時間, 終了時間)
  zanA = zanA + 間の時間を計算(TimeSerial(42, 0, 0), TimeSerial(46, 0, 0), 開始時間, 終了時間)
  
End Function

Function zanB(開始時間 As Date, 終了時間 As Date) As Date
  zanB = TimeSerial(0, 0, 0)
  If 開始時間 > 終了時間 Then
    終了時間 = 終了時間 + 1
  End If
  
  zanB = zanB + 間の時間を計算(TimeSerial(8, 0, 0), TimeSerial(18, 0, 0), 開始時間, 終了時間)
  zanB = zanB + 間の時間を計算(TimeSerial(32, 0, 0), TimeSerial(42, 0, 0), 開始時間, 終了時間)

End Function

Function zanC(開始時間 As Date, 終了時間 As Date) As Date
  zanC = TimeSerial(0, 0, 0)
  If 開始時間 > 終了時間 Then
    終了時間 = 終了時間 + 1
  End If
  
  zanC = zanC + 間の時間を計算(TimeSerial(0, 0, 0), TimeSerial(5, 0, 0), 開始時間, 終了時間)
  zanC = zanC + 間の時間を計算(TimeSerial(22, 0, 0), TimeSerial(29, 0, 0), 開始時間, 終了時間)

End Function


'開始時間~終了時間に含まれる、間隔開始~間隔終了の時間を求める
Function 間の時間を計算(間隔開始 As Date, 間隔終了 As Date, 開始時刻 As Date, 終了時刻 As Date) As Date
'@間隔開始 @間隔終了 開始時刻 終了時刻
'開始時刻 終了時刻 @間隔開始 @間隔終了
'開始時刻 @間隔開始 @間隔終了 終了時刻
'@間隔開始 開始時刻 終了時刻 @間隔終了 **************
'@間隔開始 開始時刻 @間隔終了 終了時刻
'開始時刻 @間隔開始 終了時刻 @間隔終了

  If 間隔終了 <= 開始時刻 Then
    間の時間を計算 = 0
  ElseIf 終了時刻 <= 間隔開始 Then
    間の時間を計算 = 0
  ElseIf (開始時刻 <= 間隔開始) And (間隔終了 <= 終了時刻) Then
    間の時間を計算 = 間隔終了 - 間隔開始
  ElseIf (間隔開始 <= 開始時刻) And (終了時刻 <= 間隔終了) Then
    間の時間を計算 = 終了時刻 - 開始時刻
  ElseIf (間隔開始 <= 開始時刻) And (間隔終了 <= 終了時刻) Then
    間の時間を計算 = 間隔終了 - 開始時刻
  Else
    間の時間を計算 = 終了時刻 - 間隔開始
  End If

End Function