プロが教える店舗&オフィスのセキュリティ対策術

ACCESS初心者です。
時間外入力データベースを作ろうと考えているのですが例えば時間外の入力を開始時間17:00、終了時間23:00を入力した場合、22:00以降時給が変わるので通常時間外は17:00~22:00なので300分、深夜時間外は22:00~23:00なので60分と自動で抽出し表記できるようなVBAを教えていただけませんか?
すいませんが、お願いいたします。

質問者からの補足コメント

  • ちなみに土日祝の場合、時間外は深夜帯になるのでその場合も教えて頂けると幸いです。

      補足日時:2016/06/17 14:48

A 回答 (4件)

より高い知識が必要ですね。


時間とはシリアル値で管理されているのはご存知ですか?

ま、それはともかく発想を変えてみましょう。
私なら登録時に、開始時間と終了時間から、勤務時間と休憩時間と時間外とを計算し、それぞれ登録しますね。
その方が楽ですよ。
時間も時間と分を分けて計算した方が分かりやすいです。
    • good
    • 0

' 計算するほう


Function CalcWorkingTime(aWorkingDate As Date, aTiem1 As Date, aTime2 As Date) As Variant
 Dim time1 As Date
 Dim time2 As Date
 Dim midTime As Date

 time1 = CDate(aWorkingDate & " " & aTime1) ' 開始日時
 time2 = CDate(aWorkingDate & " " & aTime2) ' 終了日時
 midTime = CDate(aWorkingDate & " " & "22:00") ' 深夜残業に突入する日時

 ' 午前様まで頑張っちゃった場合は
 If time1 > time2 Then
  time2 = DateAdd("d", 1, time2) ' 日付を 1日進めて正しい終了日時にする
 End If

 Dim returnValue(1) As Variant
 If midTime < time2 Then
  ' 深夜残業しちゃった場合
  returnValue(0) = DateDiff("n", time1, midTime) ' 通常時間外を算出
  returnValue(1) = DateDiff("n", midTime, time2) ' 深夜残業時間を算出
 Else
  ' 深夜残業しなかった場合
  returnValue(0) = DateDiff("n", time1, time2) ' 通常時間外を算出
  returnValue(1) = 0 ' 深夜残業時間は 0
 End If

 CalcWorkingTime = returnValue
End Function


' 呼び出し側
Sub hoge()
 Dim dat as Variant
 dat = CalcWorkingTime("2016/6/1", "17:00", "23:00")
 MsgBox "通常時間外は " & dat(0) & "分"
 MsgBox "深夜残業は " & dat(1) & "分"
End Sub


1つ目の引数は就業計算日
"2016/6/1" のように年月日を与える。

2つ目の引数は開始時刻
質問者の大前提として朝の始業時刻じゃなくて時間外が始まる 17時を指定したいみたいなので、"17:00" の固定値でもいいんだろうけどね。

3つ目の引数は終了時刻
質問文どおり "23:00" とか。
午前零時を超えてしまった場合もとりあえず "2:30" とか入れてやる。

この 3つの引数を得て通常時間外と深夜残業を配列で返す。


> ちなみに土日祝の場合、時間外は深夜帯になるのでその場合も教えて頂けると幸いです。
自力で頑張ってください。
「土日祝」は「会社が休みの日」という意味に変換する必要があり、会社の休日は何かの形でカレンダー情報を持っておかなければならない。
就業計算日が会社の休日であれば、開始時刻から終了時刻までが丸々深夜残業っていう風に計算すればいいと思う。
    • good
    • 1

(残業終了時間 と 深夜残業開始時間 のどちらか小さい方)ー(残業開始時間 と 深夜残業開始時間 のどちらか小さい方)


MIN("23:00" , "22:00") - MIN("17:00 , "22:00")
で通常時間外の時間を、
(残業終了時間 と 深夜残業開始時間 のどちらか大きい方)ー(深夜残業開始時間 と 残業開始時間 のどちらか大きい方)
MAX("23:00" , "22:00") - MAX("22:00" , "17:00")
で深夜時間外の時間求められるのではないか?

Excelの関数を使うならMIN関数とMAX関数だけでできる基本的な計算です。

・・・
質問文をそのまま計算式にすると
通常時間外の時間を求めるとき、
(残業終了時間 と 深夜残業開始時間 のどちらか小さい方)ー(残業開始時間)
になりますが、
残業開始時間が22:00より後になることも考慮する必要があるので、(残業開始時間)の部分を(残業開始時間 と 深夜残業開始時間 のどちらか小さい方)としています。

なお、
 残業開始時間 < 残業終了時間
であることが大前提です。
時間入力時にこのチェックをすることも忘れないでください。

このあたりのアルゴリズムはご理解いただけるでしょうか。
難しいようであれば、市販の時間管理ソフトを購入されることを自分からも勧めます。
    • good
    • 1

こんにちは



Accessで自作作成にとらわれず、市販のソフトの導入も検討してみてください。

初期導入費用はかかりますが、そのほうが、新右衛門さん自作よりもコストや性能や使いってが良い場合もあります。

市販ソフトで対応できない事をしたくなったときにこそ、新右衛門さんの出番です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A