|
わんころもち さん、こんばんわ。
>表としては、A列に社員名が並び、B列に出社時刻、C列に休憩開始時刻、
>D列に休憩終了時刻、E列に退社時刻が記載されています。
>そして、F列からP列までがそれぞれ9〜19時台をあらわしており、
>この中に、1時間丸ごと在席していれば「1」、30分しかいなければ「0.5」と
>入るようにしたいと考えております。
>それぞれの時間帯が含まれるかどうかを調べる方法はありますでしょうか。
勤務開始時刻と一致する時間帯は、60-開始分
勤務終了時刻と一致する時間帯は、終了分
範囲内の場合は60分
休憩開始時刻と一致する時間帯は、勤務分−(60-休憩開始分)
休憩終了時刻と一致する時間帯は、勤務分−休憩終了分
範囲内の場合は0分
おおまかには、こんな考え方でよいようなので。
Sub test()
ReDim dt(1 To 1, 6 To 16) As Double, rr(1 To 4) As Range
Dim Rpos As Long
'
Rpos = 2 '2行目を処理する場合
'
With Application.ActiveSheet
Set rr(1) = .Cells(Rpos, "B") '勤務開始
Set rr(2) = .Cells(Rpos, "E") '勤務終了
Set rr(3) = .Cells(Rpos, "C") '休憩開始
Set rr(4) = .Cells(Rpos, "D") '休憩終了
'
For II% = 6 To 16
HH& = II% + 3 'F列が9時
'勤務時間帯の判定(同じ時刻がはいるかもしれないのでIfで分岐)
If HH& = Hour(rr(1)) Then dt(1, II%) = 60 - Minute(rr(1)) '開始時刻
If HH& = Hour(rr(2)) Then dt(1, II%) = Minute(rr(2)) '終了時刻
If HH& > Hour(rr(1)) And HH& < Hour(rr(2)) Then dt(1, II%) = 60 '範囲内
'休憩時間の判定(同じ時刻がはいるかもしれないのでIfで分岐)
If HH& = Hour(rr(3)) Then dt(1, II%) = dt(1, II%) - (60 - Minute(rr(3)))
If HH& = Hour(rr(4)) Then dt(1, II%) = dt(1, II%) - Minute(rr(4))
If HH& > Hour(rr(3)) And HH& < Hour(rr(4)) Then dt(1, II%) = 0
'休憩開始と終了が同じ時間だった場合の調整
If dt(1, II%) < 0 Then dt(1, II%) = Abs(dt(1, II%) + 60)
'分を時間に
dt(1, II%) = dt(1, II%) / 60
Next
'
.Range(.Cells(Rpos, 6), .Cells(Rpos, 16)).Value = dt()
End With
'
Erase rr, dt
End Sub
こんな感じです。
休憩時間が勤務時間外になっていたら変な結果が出るので、計算前にチェックしたほうがよいかもしれません。
|
|