Excel宏无法识别部分10.5工时班次问题求助
考勤表VBA工时计算异常解决方案
问题背景
J列存储班次时间(如06:00-16:30),通过Text to Columns拆分到K(开始时间)、L(结束时间)列,M列用公式=(MOD(L23-K23,1))*24计算工时。VBA逻辑要求对标记为WKD且工时≥10.5小时的班次扣除0.5小时休息时间,但07:00-17:30和10:00-20:30两个班次在工作表公式=IF(M23=10.5,TRUE)验证为10.5小时的情况下,VBA未执行扣时逻辑。
问题根源
浮点数精度误差:Excel工作表公式会自动将数值舍入到显示精度,而VBA直接读取单元格的原始浮点存储值。这两个班次的计算结果可能存在极小偏差(例如实际为10.4999999999998而非精确的10.5),导致VBA中>=10.5的判断条件不成立。
解决方案
针对浮点数精度问题,可采用以下两种方法修正代码:
方法一:四舍五入到指定小数位
对M列的工时值进行四舍五入(保留1位小数)后再判断,消除微小偏差的影响:
'PLACE SHIFT TIMES Range("J23:J117").TextToColumns Destination:=Range("K23"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="-", _ FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True Dim H As Integer Dim ws As Worksheet Set ws = Sheet5 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True 'WKD AND MORE THAN 10.5(处理浮点数精度) For H = 23 To 117 If ws.Cells(H, 5).Value = "WKD" And Round(ws.Cells(H, 13).Value, 1) >= 10.5 Then ws.Cells(H, 14).Value = ws.Cells(H, 13).Value - 0.5 End If Next H
方法二:设置误差阈值
允许判断存在极小的误差范围(如1e-6),只要工时值接近10.5即触发逻辑:
'PLACE SHIFT TIMES Range("J23:J117").TextToColumns Destination:=Range("K23"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="-", _ FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True Dim H As Integer Dim ws As Worksheet Set ws = Sheet5 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True 'WKD AND MORE THAN 10.5(处理浮点数精度) For H = 23 To 117 If ws.Cells(H, 5).Value = "WKD" And ws.Cells(H, 13).Value >= 10.5 - 0.000001 Then ws.Cells(H, 14).Value = ws.Cells(H, 13).Value - 0.5 End If Next H
额外优化点
- 移除不必要的
Select操作,直接调用TextToColumns,提升代码执行效率 - 定义工作表变量
ws,避免依赖工作表名称的硬编码,增强代码稳定性
内容的提问来源于stack exchange,提问作者MJobbson
相关产品推荐
相关产品推荐

