Excel单元格公式:比较计算的时间值与手动输入的时间值时出现间歇性错误

Excel单元格公式:比较计算的时间值与手动输入的时间值时出现间歇性错误,excel,time,excel-formula,comparison,datetime-comparison,Excel,Time,Excel Formula,Comparison,Datetime Comparison,注意:我已经通过StackOverflow上列出的几种不同方法多次验证这些单元格是否包含值而不是文本 我正在尝试编写一份计划工作簿,可以告诉我目前的人员配置是否足够。有一张时间表表,每一行上有每位员工的上班打卡、下班打卡、上班打卡、午餐打卡、午餐打卡、上班打卡、下班打卡和下班打卡,这八(8)列重复七次(x7),以说明一周中的每一天。还有另一个“分析”电子表格,每行从周一上午6:30-6:45到周日下午5:45-6:00,每行增加15分钟 在分析表上,我尝试使用不同的公式将块开始和块结束时间增加1

注意:我已经通过StackOverflow上列出的几种不同方法多次验证这些单元格是否包含值而不是文本

我正在尝试编写一份计划工作簿,可以告诉我目前的人员配置是否足够。有一张时间表表,每一行上有每位员工的上班打卡、下班打卡、上班打卡、午餐打卡、午餐打卡、上班打卡、下班打卡和下班打卡,这八(8)列重复七次(x7),以说明一周中的每一天。还有另一个“分析”电子表格,每行从周一上午6:30-6:45到周日下午5:45-6:00,每行增加15分钟

在分析表上,我尝试使用不同的公式将块开始和块结束时间增加15分钟,然后填充以说明这七天中的每个块。假设我在B2单元中手动输入上午6:30,我记得尝试的公式如下:

  • =B2+(15/60/24)
  • =TRUNC(B2+时间(0,15,0,12)
当我尝试比较员工的计划开始时间是否大于或等于区块的开始时间时,以及当我尝试比较员工的计划结束时间是否大于或等于区块的结束时间时,问题变得特别痛苦。我认为这是由于计算时间的序列值与手动输入的计划时间的序列值之间存在微小的毫秒差异。但是,目标是通过a=COUNTIFS()公式运行计划,以确定该区块时间内的总员工人数。到目前为止,我提出的公式如下所示(请忽略列引用,因为我将其复制到了几列中,以便能够在第一列中尝试其他一些方法):

=COUNTIFS(OFFSET(‘前台’!$B$5:$B$24,0)(MATCH(A2,‘前台’!$B$3:$BE$3,0)-1),“,”OFFSET(‘前台’!$B$5:$B$24,0,(MATCH(A2,‘前台’!$B$3:$BE$3,0)-1),“=”和‘前台分析’!L2)+COUNTIFS(OFFSET(‘前台’!$D$5:$D$24,0,(MATCH(A2,‘前台’!$B$3:$BE 3:$BE 3,0)-1),“,”OFFSET(‘前台’!$D$4,0)(A2,“前台”!$B$3:$BE$3,0)-1),“=”和“前台分析”!L2)+COUNTIFS(抵销(“前台”!$F$5:$F$24,0,(匹配(A2,“前台”!$B$3:$BE$3,0)-1),“,”,抵销(“前台”!$F$5:$F$24,0,(匹配(A2,“前台”!$B$3:$BE 3,0)-1)),“=”和“前台分析”!$L2

请容忍我的长度和重复性,因为我试图解释四个时间间隔中的任何一个(打卡-第一次休息、第一次休息-午餐休息、午餐休息-第二次休息和第二次休息-打卡休息).我认为有必要披露该职能的长度,而且该职能的长度会越来越长,因为我需要说明一些员工可能会或可能不会在一整天中休息和/或吃午饭(想象一下,如果有人只上2到4个小时的小班,只会打卡一次)。如果我开始在其中添加一大堆复杂的嵌套ROUND()函数,我担心会达到函数极限

如果我必须总结一下这个问题,我想我有四个问题:

  • 为什么9:30 AM和10:30 AM的序列表示中的第15位十进制数字与手动输入时间的序列值相差一(1),但两者之间差值的十进制扩展没有相差?(0.3958333340000000-0.395833333000000=0.000000000000000000000)
  • 既然两个值之间的差值显然计算为零,那么为什么比较计算为false呢
  • 如果你要论证这是一个浮点计算问题,为什么不进行比较(因为每个计算值都是基于前一个值计算的,将所有后续值的差值相加),从而使该结果成为例外而不是标准值
  • 与前三种方法有点偏离主题,但这种方法与您将用于解决总体调度问题的方法类似吗,或者您建议如何解决该问题
  • 我同样对这些问题的答案感兴趣,因此请随意回答其中一个或所有问题(请在回答中注明相关问题)。提前感谢大家

    编辑:我不太熟悉在这里询问有关堆栈溢出的问题,但我相信如果您遵循以下步骤,可以创建一个最小的可复制示例:

  • 键入“6:30 AM”+在单元格B2中输入键
  • 键入“=B2+(15/60/24)”+在单元格B3中输入键
  • 单击格式绘制按钮,然后单击单元格B2,然后单击单元格B3(如果步骤1正确执行,则将公式单元格格式化为时间,否则从格式下拉列表中单击常规,然后单击时间)
  • 选择单元格B3,然后向下拖动,直到公式等于上午9:30或更高
  • 在与B列单元格相邻的C列单元格中键入“9:30 AM”+回车键,该单元格也包含值“9:30 AM”+回车键(我认为应该是第14行)
  • 在与这些单元格右侧相邻的D列单元格中,键入以下公式:
    =B14=C14
    +Enter键,您应该得到一个
    FALSE
    计算结果

  • 您正直面Excel的数据/时间系统这一古老的问题,正如您所知,它依赖于不准确的浮点数学

    解决方案始终是四舍五入到避免误差的量级:

    =ROUND(B5,7)
    
    以上将时间值舍入到第二个值,从而使接近值相等,并且一秒钟的精度应足以满足员工日程安排和工资单的要求

    现在在公式中反复使用大量ROUND()函数远远不够理想

    有两种变通方法,但都不理想

    1.)制作一张复制源数据的工作表,但要为每个cor使用ROUND()函数