-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.622958
  • 閲覧数418
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 90% (246/273)

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

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

  • 回答No.2
レベル12

ベストアンサー率 62% (292/464)

ちょっと難しい問題ですが、面白そうなので、ユーザー定義関数で対処してみました。

> マスタに、深夜勤務対象時間を持っており(例えば(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

お礼率 90% (246/273)

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

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 18% (36/194)

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

お礼率 90% (246/273)

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


このQ&Aで解決しましたか?
関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

ページ先頭へ