系统:Windows 7
软件:Excel 2010
使用场景or困惑
- 已知一件工作的开始时间和结束时间,求解工作了多少小时?
- 不考虑一天中的非工作时间,例如午休时间
示例:求解工作时长
思考
- 考虑通用性,一天中的工作时间可以调整并且增加分段,例如由原来的两班次变成三班次
- 每一整天中工作时长是一致的,那么我们只需要计算开始那一天和结束那一天的工作时长,再加上中间完整天的工作时长即可
- 两个核心概念
- 单天中工作时长计算
- 单天结束时间为:23:59:59
- 单天开始时间为:00:00:00
- 一整天工作时长计算
- 单天中工作时长计算
代码框架
- 过程
main
:主过程,循环每一行,写入工作时长进工作表 - 函数
get_work_time
:求解每一行的工作时长 - 函数
get_part_day
:求解非完整天工作时长 - 函数
get_entire_day
:求解完整一天工作时长
代码
过程main
Sub main()
Set sht = ThisWorkbook.Worksheets("示例")
max_row = sht.Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To max_row Step 1
start_time = sht.Cells(i, "A")
end_time = sht.Cells(i, "B")
work_time = get_work_time(start_time, end_time)
sht.Cells(i, "C") = work_time
Next i
End Sub
代码截图
函数get_work_time
Function get_work_time(start_time, end_time)
date_time_start = CDate(start_time)
date_time_end = CDate(end_time)
date_start = DateSerial(Year(date_time_start), Month(date_time_start), Day(date_time_start))
date_end = DateSerial(Year(date_time_end), Month(date_time_end), Day(date_time_end))
day_i = DateDiff("d", start_time, end_time)
time_start = CDate(FormatDateTime(date_time_start, 4))
time_end = CDate(FormatDateTime(date_time_end, 4))
If day_i = 0 Then
time_start_use = time_start
time_end_use = time_end
hour_ = get_part_day(time_start_use, time_end_use)
ElseIf day_i = 1 Then
time_start_use = time_start
time_end_use = CDate("23:59:59")
hour_1 = get_part_day(time_start_use, time_end_use)
time_start_use = CDate("00:00:00")
time_end_use = CDate(time_end)
hour_2 = get_part_day(time_start_use, time_end_use)
hour_ = hour_1 + hour_2
Else
time_start_use = time_start
time_end_use = CDate("23:59:59")
hour_1 = get_part_day(time_start_use, time_end_use)
time_start_use = CDate("00:00:00")
time_end_use = CDate(time_end)
hour_2 = get_part_day(time_start_use, time_end_use)
whole_day_work = get_entire_day()
hour_3 = (day_i - 1) * whole_day_work
hour_ = hour_1 + hour_2 + hour_3
End If
get_work_time = hour_
End Function
代码截图
函数get_part_day
Function get_part_day(time_start_use, time_end_use)
Rem>>
Rem>>
Set sht = ThisWorkbook.Worksheets("示例")
max_row = sht.Cells(Rows.Count, "F").End(xlUp).Row
time_total = 0
For i = 2 To max_row Step 1
start_time = CDate(sht.Cells(i, "F"))
end_time = CDate(sht.Cells(i, "G"))
If time_start_use > start_time Then
time_start = time_start_use
Else
time_start = start_time
End If
If time_end_use < end_time Then
time_end = time_end_use
Else
time_end = end_time
End If
If time_start > time_end Then
hour_i = 0
Else
time_i = DateDiff("s", time_start, time_end)
hour_i = Round(time_i / 3600, 2)
End If
time_total = time_total + hour_i
Next i
get_part_day = time_total
End Function
代码截图
函数get_entire_day
Function get_entire_day()
Rem>>
Rem>>
Set sht = ThisWorkbook.Worksheets("示例")
max_row = sht.Cells(Rows.Count, "F").End(xlUp).Row
time_total = 0
For i = 2 To max_row Step 1
start_time = CDate(sht.Cells(i, "F"))
end_time = CDate(sht.Cells(i, "G"))
time_i = DateDiff("s", start_time, end_time)
hour_i = Round(time_i / 3600, 2)
time_total = time_total + hour_i
Next i
get_entire_day = time_total
End Function
代码截图
执行结果
部分代码解读
time_i = DateDiff("s", start_time, end_time)
计算两段的时间差
以上为本次的学习内容,下回见
更多精彩,请关注微信公众号
扫描二维码,关注本公众号