ちょっと難しい問題ですが、面白そうなので、ユーザー定義関数で対処してみました。
> マスタに、深夜勤務対象時間を持っており(例えば(1)22:00~(2)05:00というような感
> じで、修正可能です。
ということですので、説明上このテーブル名を「深夜時間帯設定TBL」とします。
さらにフィールド名を「深夜始時間」と「深夜終時間」として、先頭レコードに
それぞれの時間が、設定されているものとします。
「標準モジュール」に下記コードを貼り付けます。
使い方は、ShinyaH(時間始め, 時間終り) で 「深夜時間帯設定TBL」を参照し、
指定した時間帯に含まれる「深夜勤務時間」を返します。
例えば、クエリでこの関数を使用する場合で、質問内容のように残業時間の中に含まれる
テーブルで指定した「深夜勤務時間」を算出する場合は、フィールドに
深夜勤務時間:ShinyaH([残業開始時刻],[残業終了時刻])
というように計算式を設定します。
Function ShinyaH(ZanStart, ZanEnd) As Variant
Dim ShinyaStartH As Date
Dim ShinyaEndH As Date
Dim ZanStartH As Date
Dim ZanEndH As Date
Dim ValShinya As Single
If IsDate(ZanStart) = False Or IsDate(ZanEnd) = False Then
ShinyaH = vbNullString
Exit Function
End If
ZanStartH = TimeValue(ZanStart)
ZanEndH = TimeValue(ZanEnd)
ShinyaStartH = DFirst("深夜始時間", "深夜時間帯設定TBL")
ShinyaEndH = DFirst("深夜終時間", "深夜時間帯設定TBL")
If ZanStartH < ZanEndH Then ' 日を跨がない勤務
If ZanStartH >= ShinyaStartH Then
ValShinya = (ZanEndH - ZanStartH) * 24
ElseIf ZanStartH >= ShinyaEndH And ZanEndH > ShinyaStartH Then
ValShinya = (ZanEndH - ShinyaStartH) * 24
End If
If ZanStartH < ShinyaEndH Then ' 早朝勤務
If ZanEndH > ShinyaStartH Then
ValShinya = (ShinyaEndH - ZanStartH + ZanEndH - ShinyaStartH) * 24
ElseIf ZanEndH <= ShinyaStartH And ZanEndH > ShinyaEndH Then
ValShinya = (ShinyaEndH - ZanStartH) * 24
ElseIf ZanEndH <= ShinyaEndH Then
ValShinya = (ZanEndH - ZanStartH) * 24
End If
End If
ElseIf ZanStartH > ZanEndH Then ' 日を跨ぐ勤務
If ZanStartH >= ShinyaStartH And ZanEndH <= ShinyaEndH Then
ValShinya = (ZanEndH + 1 - ZanStartH) * 24
ElseIf ZanStartH >= ShinyaStartH And ZanEndH > ShinyaEndH Then
ValShinya = (ShinyaEndH + 1 - ZanStartH) * 24
ElseIf ZanStartH < ShinyaStartH And ZanEnd <= ShinyaEndH Then
ValShinya = (ZanEndH + 1 - ShinyaStartH) * 24
ElseIf ZanStartH < ShinyaStartH And ZanEndH >= ShinyaEndH Then
ValShinya = (ShinyaEndH + 1 - ShinyaStartH) * 24
End If
Else
ValShinya = 0
End If
ShinyaH = Format(ValShinya / 24, "h:nn")
End Function
お礼
こんにちは。ユーザー定義関数を使うなんて、考え付きませんでした。わざわざ書いてくださってありがとうございます。試行錯誤の結果、残業時間から普通時間と深夜時間を出すことができました。回答どうもありがとうございました。