Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2016)
勤怠管理の考え方について
投稿日時: 17/11/16 16:00:48
投稿者: ぽろんちょ

いつも大変お世話になります。
 
アクセスで派遣社員の勤怠管理を作ることになりました。
感じとしてはフォームに年、月、派遣会社名、作業員名をコンボボックスで表示し、検索ボタンを押すと
該当する作業員の1日から末日までのカレンダーをサブフォームに表示し、そこに勤務状況を入力していく形にしました。
 
サブフォーム内には各レコードごとに『確定』ボタンを設置し、そこを押すことによってその日の勤務時間が確定し、サブプロシージャに値を渡して勤務時間を計算するようにしました。
 
弊社は24時間稼動の倉庫業務で、作業員の出勤時間がそれぞれ違ってきます。
それに基本時間(22時〜29時を除く)と深夜時間(22時〜29時)と残業時間それぞれに時給が設定されております。さらに早出や遅刻などがあるとどのような発想で作ればいいのか悩んでいます。
 
一応下記が途中まで作った、それぞれ基本時間や深夜時間を計算するものです。
20時〜29時(翌日の5時)までの勤務時間の場合です。
 
Sub 時間計算1(ByVal 日付 As Date, ByVal 出勤時間 As Date, ByVal 退勤日 As Date, ByVal 退勤時間 As Date, ByVal 作業員ID As Integer, ByVal 派遣会社ID As Integer)
     
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
     
    Dim StartDay As Date
    Dim StartTime As Date
    Dim EndDay As Date
    Dim EndTime As Date
     
    Dim StartAwase As Date
    Dim EndAwase As Date
    Dim Goukei As Integer
    Dim FutuJikan As Integer
    Dim HayadeJikan As Integer
    Dim ZangyoJikan As Integer
    Dim ShinyaJikan As Integer
    Dim SagyoinID As Integer
    Dim CompanyID As Integer
     
    Dim Kakunin As Integer
     
    Set cn = CurrentProject.Connection
    rs.Open "T勤務時間", cn, adOpenKeyset, adLockOptimistic
     
    StartDay = 日付
    StartTime = 出勤時間
    EndDay = 退勤日
    EndTime = 退勤時間
    SagyoinID = 作業員ID
    CompanyID = 派遣会社ID
     
    StartAwase = StartDay + StartTime
    EndAwase = EndDay + EndTime
     
  '出勤時間の計算
    If StartAwase <= StartDay + TimeValue("20:00:00") And StartAwase <= StartDay + TimeValue("22:00:00") Then
        HayadeJikan = DateDiff("n", StartAwase, StartDay + TimeValue("20:00:00"))
        FutuJikan = DateDiff("n", StartDay + TimeValue("20:00:00"), StartDay + TimeValue("22:00:00"))
    ElseIf StartAwase <= StartDay + TimeValue("22:00:00") Then
        FutuJikan = DateDiff("n", StartAwase, StartDay + TimeValue("22:00:00"))
    End If
     
    '退勤時間の計算
    If StartAwase >= StartDay + TimeValue("22:00:00") And EndAwase <= EndDay + TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartAwase, EndAwase)
    ElseIf StartAwase >= StartDay + TimeValue("22:00:00") And EndAwase >= TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartAwase, EndDay + TimeValue("5:00:00"))
        ZangyoJikan = DateDiff("n", EndDay + TimeValue("5:00:00"), EndAwase)
    ElseIf StartAwase = StartDay + TimeValue("22:00:00") And EndAwase <= EndDay + TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartAwase, EndAwase)
    ElseIf StartAwase = StartDay + TimeValue("22:00:00") And EndAwase >= EndDay + TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartAwase, StartDay + TimeValue("22:00:00"))
        ZangyoJikan = DateDiff("n", EndDay + TimeValue("5:00:00"), EndAwase)
    ElseIf StartAwase <= StartDay + TimeValue("22:00:00") And EndAwase <= EndDay + TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartDay + TimeValue("22:00:00"), EndAwase)
    ElseIf StartAwase <= StartDay + TimeValue("22:00:00") And EndAwase >= EndDay + TimeValue("5:00:00") Then
        ShinyaJikan = DateDiff("n", StartDay + TimeValue("22:00:00"), EndDay + TimeValue("5:00:00"))
        ZangyoJikan = DateDiff("n", EndDay + TimeValue("5:00:00"), EndAwase)
    End If
     
    With rs
        .AddNew
        !作業員ID = SagyoinID
        !派遣会社ID = CompanyID
        !業務開始日 = StartDay
        !業務開始時間 = StartTime
        !業務終了日 = EndDay
        !業務終了時間 = EndTime
        !早出時間 = HayadeJikan
        !基本時間 = FutuJikan
        !深夜時間 = ShinyaJikan
        !残業時間 = ZangyoJikan
        .Update
    End With
     
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
     
End Sub
 
ここまで作ってみたのですが、遅刻をした時の処理が書けていませんでした。
お恥ずかしい話ですが自分で作っていてもIfばかりでわけがわからなくなってしまいます。
しかもこれだと汎用性がなくそれぞれのパターンを作らなければなりません...。
 
そこで質問なのですが、それぞれが複雑な勤務体系だった場合、上記のようにIf関数で細かく条件を
書いて計算するしかないのでしょうか?それとももっと簡単な発想で作れるものなのでしょうか?
勤怠管理自体を作ったことがないので、どのような発想で作れば良いのか悩んでいます。
 
どなたか詳しい方なにかアドバイス宜しくお願い致します。

回答
投稿日時: 17/11/16 17:08:49
投稿者: Suzu

こんにちは。
 
勤務パターンが多い場合について
勤務パターンをマスターとして持たせる事が多いです。
 
【勤務パターンマスタ】テーブル
・勤務タイプ
・勤務名
・出勤時刻
・退勤時刻
・休憩時間
・定時時間
・深夜時間
・交代勤務 (Yes/No)
    :
   etc
 
時刻については、
日付時刻型ではなく 27.5 の様に数値にした方が楽だと思います。

回答
投稿日時: 17/11/16 18:08:24
投稿者: sk

引用:
弊社は24時間稼動の倉庫業務で、作業員の出勤時間がそれぞれ違ってきます。

変形労働時間制フレックスタイム制のどちらを
適用されているのでしょうか。
 
引用:
それに基本時間(22時〜29時を除く)と深夜時間(22時〜29時)と
残業時間それぞれに時給が設定されております。

引用:
さらに早出遅刻などがあるとどのような発想で作ればいいのか悩んでいます。

いずれも御社の就業規則(及び労働基準法)における
時間外労働時間の扱い方に従って考えられるのが筋。
 
引用:
一応下記が途中まで作った、それぞれ基本時間や深夜時間を計算するものです。
20時29時(翌日の5時)までの勤務時間の場合です。

(標準となる)始業時刻と終業時刻が
作業員ごとによって異なるということであれば、
当然それらの情報を管理するためのテーブルが
(社員マスタに従属する形で)必要となるはず。

投稿日時: 17/11/17 10:46:03
投稿者: ぽろんちょ

Suzu様、sk様
 
早速の返信有難うございます。
勤務パターンごとにテーブルを作成するといいのですね。
ご指摘の通りテーブル作成をしてまた考えていこうと思います。
 
あともう一つ質問なのですが、遅刻をした時の計算方法がなかなか導き出せません。
例として、20時〜29時勤務の社員がいたとして、一時間半遅刻して21時半〜31時まで仕事をしたとします。
時給の区分として
基本時間:22時〜29時を除くすべて
深夜時間:22時〜29時
残業時間:勤務時間が8時間を越えた場合
があります。
 
上記の遅刻をした場合90分時間が押すので、
基本時間:21時半〜22時(30分)
深夜時間:22時〜29時(360分)※休憩60分マイナス
基本時間:29時〜30時半(90分)←この時間をどう計算すればいいのか悩んでます。
残業時間:30時半〜31時(30分)
となります。
このように仮に早出や遅刻があった場合にも、サブフォーム上に出退勤時間を入力しただけで
作業時間の自給区分が柔軟に計算できるようにしたいのですが、
どのように計算すればいいのかうまく導き出せません。
 
なにか良い方法、もしくは考え方がありましたらアドバイス宜しくお願いいたします。

回答
投稿日時: 17/11/17 17:04:59
投稿者: Suzu

こんばんは
 
勤怠の考え方について
【残業時間:勤務時間が8時間を越えた場合】
これで良かったのかな・・
 
私のうろ覚えですが
    残業側 の プラス の係数 1.25
    遅刻/早退 の マイナス の係数 いくつだか忘れました
で差し引きした時、の値と
 
今回の様に、残業分と遅刻・早退の値を単純に差引した時の結果は違った記憶があります。
 
 
なので、私がやったのは
 
規定シフト 20〜29
深夜手当 22〜29
 
勤務時刻 21.5〜31
 
定時勤務 8
遅刻 -1.5
残業 2
深夜手当 6
 
と計算させた記憶があります。
 
深夜分の時給は上がるのでしょうが、
深夜以外の単価 深夜時の単価 の差額分が手当と考え それに該当する部分が 6時間分 ある
なので、定時勤務分が何時間と考えていました。(用語的に間違いがありますがご容赦を。)

回答
投稿日時: 17/11/17 18:00:09
投稿者: sk

引用:
深夜時間:22時〜29時(360分)※休憩60分マイナス

休憩時間の有無が「就業開始からの経過時間」に応じて決まるのか、
休憩を採るべき時間帯(休憩開始時刻と休憩終了時刻)が
あらかじめ固定されているのか、どちらなのでしょうか。
 
引用:
残業時間:勤務時間が8時間を越えた場合

ならば勤務時間を求めるのが先。

投稿日時: 17/11/22 11:04:46
投稿者: ぽろんちょ

Suzu様、sk様
 

引用:
深夜分の時給は上がるのでしょうが、
 深夜以外の単価 深夜時の単価 の差額分が手当と考え それに該当する部分が 6時間分 ある
 なので、定時勤務分が何時間と考えていました。

 
この発想で計算したらなんとか出来そうな感じになりました。
もっと簡単に勤怠管理ができるかと思っていましたが、予想以上に考える事が多く大変です...。
お忙しいところアドバイス頂き有難うございました。