答案1
如果您的数据在 A1:B10 中且表格在 D1:H9 中,则可以使用:
=SUM(($A$1:$A$10<=$D2)*($A$1:$A$10>=($D2-6))*(VALUE(LEFT($B$1:$B$10,FIND(" ",$B$1:$B$10)-1))=COLUMN()-4))
前三列
=SUM(($A$1:$A$10<=$D2)*($A$1:$A$10>=($D2-6))*(VALUE(LEFT($B$1:$B$10,FIND(" ",$B$1:$B$10)-1))>=COLUMN()-4))
对于 3+ 天列。
(前三列和第四列之间的唯一区别是>=
末尾的 ( ... >=COLUMN()-4))
。这是因为符合条件的条目可能具有的天数不止一个值:4、5、404、28 等等,只是没有 1、2 或 3。)
这是一种较老的技术,但有时比COUNTIFS()
在有多个条件的情况下尝试的自然函数更容易使用。它从每个Range = Some criteria
子句中创建一个内部(公式)数组。这些数组值都是TRUE
或FALSE
结果,但对它们的算术运算(此处为乘法)强制(用 Excel 的说法是“强制”)它们为 1 和 0。如果您有一个测试,您需要将整个测试放在括号内并将其乘以 1。但在这里,乘以其他测试结果数组就可以了。
因为您想要AND
将这些结果数组相乘。如果您愿意,OR
您可以将它们相加。Excel 将除 0 以外的任何值视为 12,因此TRUE
12 个测试全部TRUE
等于 12 对 Excel 来说只是TRUE
1,不是 1 则不会出错。因此,如果某个条目不满足一个或多个条件,它将产生 0,因此无论它是否在其余部分产生匹配,乘法都将产生 0,因此总体上不匹配。
SUM()
公式中 的目的是折叠生成的内部数组。这一直是需要的,但现在它主要是为了防止错误Spill
。您希望每个单元格中只有一个条目,因此您肯定不想要结果Spill
,并且在旧版本中,它会将结果数组中的所有条目相加以给出正确答案。如果没有它,单元格中只会报告结果数组中的第一个条目,只有巧合才能使任何结果正确。
与您的问题相关的是日期条件。您有一个看起来像是某个时期结束日期的日期,并且暗示它们涵盖了几周,因为日期相隔七天。因此,您可以将一个条件设置为“小于或等于显示的日期”,将第二个条件设置为“大于或等于比显示的日期少六天”,这将捕获您列出的每周的所有条目。
上面的最后一个条件是从您输入的内容中找到的。您可以SUBSTITUTE()
改为使用两个条件,其中一个条件“包装”另一个条件,先删除“Days”(内部条件),然后删除“Day”(外部条件)(以另一种方式包装它们将只留下一个“s”需要删除,这对于您的输入内容来说应该没问题,但一般来说,您需要更多的确定性...因此,您需要先执行较长的条件,然后再执行较短的条件。不过,通过查找第一个空格字符并只取其左侧的内容,然后将文本的输出重新转换为数字以方便比较FIND()
,可以省去所有麻烦。VALUE()
LEFT()
您可以“精简”公式,并可能将其归结为一个公式,而不是像这里一样有两个公式,但我没有时间。进行稍微不同的“精简”的一种方法是将部分替换COLUMN()-4
为COLUMN()-@COLUMN($D$1:$H$9)
(我使用 D1:H9 进行设置),当然,可以用来LET()
设置变量信息,如输入日期和所用时间列,这样将公式的变量部分全部放在前面,以便在必要时可以轻松找到和更改它们。
但是,不管是否巧妙,这两个公式都可以解决问题。这种方法的另一个优点是,您可以设置尽可能多的条件,只要符合 Excel 的公式长度限制,而不只是 提供的 127 个条件COUNTIFS()
。(当然,有些人可能需要这样做,以达到某些神秘的目的,但大多数人永远不会这样做。)