エクセル小僧:勤務時間計算(徹夜対応版) [コンピューター]
出社時刻(例:「9:30」)、退社時刻(例:「8:30」)から、勤務時間を計算するマクロです。
解説はしません。。暇が無いので。。すみません。。
Sub test()
' 出社時刻(例:「9:30」)、退社時刻(例:「8:30」)から、勤務時間を計算
' 退社時刻が「0:00」から「8:30」までの場合、翌日退社として扱う
' 「2:15」から「2:30」の間を休憩時間とし、勤務時間から引く
' 出社「9:30」、退社「8:30」の場合⇒勤務時間「22:45」
Dim time1(5) As Date ' 日付シリアル値
Dim i As Integer ' 整数
time1(0) = CDate(Range("A23").Value) ' 出社時刻 例:「9:30」
time1(1) = CDate(Range("B23").Value) ' 退社時刻 例:「8:30」
time1(2) = TimeSerial(0, 0, 0) ' 0時0分
time1(3) = TimeSerial(8, 30, 0) ' 8時30分
' 2014/1/1を足す
For i = 0 To 3
time1(i) = time1(i) + DateSerial(2014, 1, 1)
Next i
' 退社時刻が「0時0分」から「8時30分」なら、1日ずらす
If (time1(1) >= time1(2)) And (time1(1) <= time1(3)) Then
time1(1) = DateAdd("d", 1, time1(1))
End If
If time1(1) >= time1(0) Then
time1(5) = time1(1) - time1(0) ' 勤務時間(休憩時間込み)
Range("D23").Value = time1(5)
End If
' 出社した日の0時0分0秒
time1(2) = DateSerial(Year(time1(0)), Month(time1(0)), Day(time1(0)))
' 出社した翌日の2時15分0秒
time1(3) = DateAdd("d", 1, time1(2)) + TimeSerial(2, 15, 0)
' 出社した翌日の2時30分0秒
time1(4) = DateAdd("d", 1, time1(2)) + TimeSerial(2, 30, 0)
' 条件1 : 出社時刻が、出社した翌日の2時15分0秒以前である
' 条件2 : 退社時刻が、出社した翌日の2時30分0秒以後である
' 条件1と条件2の両方が真の場合、2時15分 - 2時30分の休憩時間を引く
If (time1(0) <= time1(3)) And (time1(1) >= time1(4)) Then
time1(5) = time1(5) - TimeSerial(0, 15, 0)
End If
Range("C23").Value = time1(5)
End Sub
※出社時刻、退社時刻に2014/1/1を足してますが、必要ないかもしれません。足さないとコンピュータが扱える日付の一番古い値(1900/1/1?)になってしまうのが気持ち悪いので足しています。
このごたごたが片付いたら、こんなの買おうかな。。
解説はしません。。暇が無いので。。すみません。。
Sub test()
' 出社時刻(例:「9:30」)、退社時刻(例:「8:30」)から、勤務時間を計算
' 退社時刻が「0:00」から「8:30」までの場合、翌日退社として扱う
' 「2:15」から「2:30」の間を休憩時間とし、勤務時間から引く
' 出社「9:30」、退社「8:30」の場合⇒勤務時間「22:45」
Dim time1(5) As Date ' 日付シリアル値
Dim i As Integer ' 整数
time1(0) = CDate(Range("A23").Value) ' 出社時刻 例:「9:30」
time1(1) = CDate(Range("B23").Value) ' 退社時刻 例:「8:30」
time1(2) = TimeSerial(0, 0, 0) ' 0時0分
time1(3) = TimeSerial(8, 30, 0) ' 8時30分
' 2014/1/1を足す
For i = 0 To 3
time1(i) = time1(i) + DateSerial(2014, 1, 1)
Next i
' 退社時刻が「0時0分」から「8時30分」なら、1日ずらす
If (time1(1) >= time1(2)) And (time1(1) <= time1(3)) Then
time1(1) = DateAdd("d", 1, time1(1))
End If
If time1(1) >= time1(0) Then
time1(5) = time1(1) - time1(0) ' 勤務時間(休憩時間込み)
Range("D23").Value = time1(5)
End If
' 出社した日の0時0分0秒
time1(2) = DateSerial(Year(time1(0)), Month(time1(0)), Day(time1(0)))
' 出社した翌日の2時15分0秒
time1(3) = DateAdd("d", 1, time1(2)) + TimeSerial(2, 15, 0)
' 出社した翌日の2時30分0秒
time1(4) = DateAdd("d", 1, time1(2)) + TimeSerial(2, 30, 0)
' 条件1 : 出社時刻が、出社した翌日の2時15分0秒以前である
' 条件2 : 退社時刻が、出社した翌日の2時30分0秒以後である
' 条件1と条件2の両方が真の場合、2時15分 - 2時30分の休憩時間を引く
If (time1(0) <= time1(3)) And (time1(1) >= time1(4)) Then
time1(5) = time1(5) - TimeSerial(0, 15, 0)
End If
Range("C23").Value = time1(5)
End Sub
※出社時刻、退社時刻に2014/1/1を足してますが、必要ないかもしれません。足さないとコンピュータが扱える日付の一番古い値(1900/1/1?)になってしまうのが気持ち悪いので足しています。
このごたごたが片付いたら、こんなの買おうかな。。
就業時間は、
しっかり記録に残して置いた方がいいですよ。
イザと言うときに、助けになりますからね。。
昔のプリメインアンプを持っています。
捨てられない・・・
by なんだかなぁ〜!! 横 濱男 (2014-04-06 21:11)
なんだかなぁ〜!! 横 濱男さん、
アドバイスありがとうございます。記録だけはとってあります。
カセットデッキとMDデッキは処分しましたが、CDプレーヤーとプリメインアンプはうちでも現役です。
「やったぜ!」 ありがとうございます。[__猫]
by cheese999 (2014-04-07 05:35)