お世話になります
時間の計算でハマってしまったのでご協力をお願いします。
困っていること
ルールは
4時間を超えた場合は30分の休憩を1回
6時間-8時間の場合は45分休憩
例えば、8時間丁度なら45分休憩
8時間1分ならば30分が2回で1時間休憩
上記のルールで作成する予定です
(まだ 6時間の判定とかはできていません)
D7=8:00
E7=16:30
稼働時間:8時間30分
の時に
休憩は30分だけでよいのに2回ループして
1時間になってしまう。
試したこと
最後から3番目の行の
If data = t4 Then Exit Do を追加してループを強制的に抜けさせようと試みましたが機能しませんでした。
知りたいこと
If data = t4 Then Exit Doを機能させる方法
又は
そもそも、そのやり方じゃなくて
もっと良いやり方が有るなど、有りましたらご教示よろしくお願いいたします。
以下コード
汚いコードで申し訳ないです
VBA
1Function YEX_QK() 2Dim QK As Date 3Dim QK_COUNT As Integer 4Dim data As Date 5Dim t03 As Date 6Dim t4 As Date 7Dim t6 As Date 8Dim t8 As Date 9Dim YEX_QK2 As Date 10t03 = TimeValue("0:30:00") 11t4 = TimeValue("4:00:00") 12t6 = TimeValue("6:00:00") 13t8 = TimeValue("8:00:00") 14 15data = ActiveSheet.Range("e7") - ActiveSheet.Range("d7") 16MsgBox data 17Do While data > t4 18 data = data - t4 19 data = data - t03 20 QK = QK + t03 21 MsgBox "data=" & data & vbCrLf & "QK=" & QK 22'残りぴったり4時間ならループ脱出 23 If data = t4 Then Exit Do 24Loop 25 26End Function
YEX_QK関数は、E7-D7の時間を稼働時間とみなし、その稼働時間に見合った休憩時間を返却する関数ということでよいでしょうか?
0~4時間未満は0分
4~6時間未満は30分
6~8時間未満は45分
8時間以上は60分
ということですか?
はい、その通りです
あ、8時間以上と言うより
4時間毎に30分休憩なので
8:00から4時間稼働で12:00
そこから30分休憩で
12:30スタートで更に4時間稼働で16:30
なのですが上記の場合は、休憩は1回で30分だけです。
16:31分だと4時間を超えてしまうので30分休憩を取るルールです。
労働基準法の休憩時間によりますと、「労働時間が6時間を超える場合は45分以上、8時間を超える場合は1時間以上」とあるので、6時間働き、休憩時間が60分でもOKなような気がしますが、その辺は設計に含めないということでしょうか?
ルール的にはOKですが、休憩を多く引いてしまうと給料がへっちゃうので^^;
厳密な計算で行きたいと思います。
最初のdataの計算時、DateDiff()で、分数を取得するようにしたら、以後の処理は整数演算のみになるかと。
data = DateDiff("n", ActiveSheet.Range("d7"), ActiveSheet.Range("e7"))
こういう事でしょうか???
やってみましたが、1901/5/24と言う表示が出てきました。
それは、510(分)をDate型に変換したからです。
素直にInteger型で受け取ってください。
ついでに言うと、プログラミングの場合、時刻と時間は峻別する必要がありますので、ご留意ください。
Date型は日付時刻型、セルに入力されているのは時刻、稼働時間や休憩時間、4時間毎などは、全て時間です。
これらを混在して処理している為、誤りが発生しています。
なるほど!!
奥が深いですね・・・・
回答2件
あなたの回答
tips
プレビュー