• ベストアンサー

深夜残業時間を求めたいのです。

こんにちは。 Access2000で、勤怠管理システムを作成しています。 マスタに、深夜勤務対象時間を持っており(例えば(1)22:00~(2)05:00というような感じで、修正可能です。項目は日付/時刻型で、(1)と(2)のフィールドは分かれています)、残業時間の管理で、残業開始時刻と、残業終了時刻を入力すると残業時間を自動で計算する仕組みなのですが、その際に、深夜勤務対象時間の時間も計算して、自動で表示させたいのです。今のところ、残業時間を求めるロジックはできていますが、深夜勤務の対象となる時間を求めることができません。0時を超えるときの処理など、思ったようにできなくて… 分かりにくいかとは思いますが、よい方法をご存知の方、回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

ちょっと難しい問題ですが、面白そうなので、ユーザー定義関数で対処してみました。 > マスタに、深夜勤務対象時間を持っており(例えば(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

satie
質問者

お礼

こんにちは。ユーザー定義関数を使うなんて、考え付きませんでした。わざわざ書いてくださってありがとうございます。試行錯誤の結果、残業時間から普通時間と深夜時間を出すことができました。回答どうもありがとうございました。

その他の回答 (1)

  • ka3
  • ベストアンサー率18% (36/194)
回答No.1

 22時から24時までと0時から5時に分けて考えて頂き、式「終了時刻 - 開始時刻」の結果が負になる場合には、24を加えると結果を求められます。  =IF(終了時刻-開始時刻<0,終了時刻-開始時刻+24,終了時刻-開始時刻)

satie
質問者

お礼

こんにちは。上記の方法は既に、トータルの時間を求めるときに使用しています。試行錯誤の結果、残業時間から普通時間と深夜時間を出すことができました。回答どうもありがとうございました。