'久候无回音,又要暂别eh了...
'算了,就这样吧..
'有不明白的自己在调试中添加监视,看看那些变量是怎么变化的就行了..
'细节自己慢慢完善
Sub lsftest()
Dim a(1 To 962), st, et As Date '建数组,用来装载每天工作的时间,以分钟为间隔,每天工作16小时,其实是962分钟.
'填入上午的工作时间
For i = 1 To 481
a(i) = DateAdd("n", i - 1, Cells(6, 7))
Next
'填入下午的时间
For i = 482 To 962
a(i) = DateAdd("n", i + 88, Cells(6, 7))
Next
st = Cells(6, 7)
b = Range("b" & Rows.Count).End(xlUp).Row
For j = 10 To b
'填入开始时间
Cells(j, 15) = st
'计算用时要多少天
dc = (Cells(j, 3) / (110 / Cells(j, 4) / 8) * 60) \ 962
'计算用时除却整数工作日后剩余的分钟数
mc = (Cells(j, 3) / (110 / Cells(j, 4) / 8) * 60) Mod 962
'有秒数的向上取整
If Int((Cells(j, 3) / (110 / Cells(j, 4) / 8) * 60)) <> (Cells(j, 3) / (110 / Cells(j, 4) / 8) * 60) Then mc = mc + 1
'计算开始时间对应于数组里的位置
If TimeValue(st) > TimeValue("3:00:00") Then
If TimeValue(st) > TimeValue("16:00:00") Then
c = DateDiff("n", TimeValue("8:00:00"), TimeValue(st)) - 88
Else
c = DateDiff("n", TimeValue("8:00:00"), TimeValue(st)) + 1
End If
Else
c = DateDiff("n", TimeValue("0:00:00"), TimeValue(st)) + 872
End If
'计算结果时间在数组里的位置:
If mc + c > 962 Then
'如果剩余分钟数超出了晚班下班时间,日期要加一,并减去一天工作的分钟数,再从数组开端数起
'例如,某天晚上23:00才开始新一批产品加工,这批产品总需时20小时,即其加工时间已经是横跨3天了..
dc = dc + 1
mc = mc + c - 962
Else
'如果剩余分钟数不超出一天,直接在数组里获取结束时间分钟数
mc = mc + c
End If
'计算结束时间的日期
et = DateAdd("d", dc, st)
'组合结束时间
rs = DateValue(et) + TimeValue(a(mc))
Cells(j, 16) = rs
'判断机号,如果是另一台机,从新开始计算
If Cells(j, 1) = Cells(j + 1, 1) Then
'换新产品加30分钟
st = DateAdd("n", 30, Cells(j, 16))
Else
st = Cells(6, 7)
End If
Next
End Sub
[ 本帖最后由 lsftest 于 2011-6-6 14:38 编辑 ] |