You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:35:21