我正在尝试使用 Excel 公式从左侧计算一行中值大于 50 的连续 Excel 单元格。

例如 – 在第 3 行,有连续 3 个单元格的值 >50。但是,从左侧数起,有 2 个单元格的值 >50,然后有一个单元格的值 < 50。因此,o/p 将是 2,而不是 3。

预期输出在“计数”列中。

3

  • 1
    应该是>=50因为如果只有>50第二个应该是 1 而不是 3,你就不会修复它或澄清同样的事情


    – 

  • @MayukhBhattacharya 在编辑显示附加列之前,值显示为小数点后 2 位,而不是四舍五入到最接近的数字。第二行的第二个值是 50.04 — 所以我推测它仍然,只是显示不正确。这就是为什么 OP 最好将数据放在表格中,而不是图像中。(此外,用户可以复制/粘贴它进行测试)


    – 

  • @Chronocidal 注意到了!您说得对。数值仍然保留小数点后 2 位。


    – 


7 个回答
7

=FIND("0", CONCAT(--(B1:E1>50))&"0")-1

这只是将单元格值更改为1(>50) 和0(≤50),将它们全部连接成一个字符串,0在末尾添加另一个字符串(以覆盖所有值都 >50 的边缘情况),然后找出1第一个 之前有多少个0。这确保它只从左边缘计数。

数数 2024 年 10 月 26 日 2024 年 10 月 25 日 2024 年 10 月 24 日 2024 年 10 月 23 日
1 52.38 40.3 50.39 46.32
3 52.94 50.04 50.82 47.53
2 53.06 51.39 三十五 65
3 53.48 50.68 50.69 47.64
1 53.48 47.64 50.68 50.69
0 47.64 53.48 50.68 50.69

0

使用旧函数数组公式并向下拖动:

=COLUMN(INDEX($A1:$D1,0,MATCH(0, IF($A1:$D1>50,1,0),0 )))-1

或更简单

=MATCH(0, IF($A1:$D1>50,1,0),0 )-1

第一个值在 A 列。如果不是,请根据第一个数据列编号值修正减去的值。

如果所有值都可能大于,则50使用这个高级公式:

=IFERROR(MATCH(0, IF($A1:$D1>50,1,0),0 )-1,COLUMNS($A1:$D1))

2

  • 如果整个范围大于 50,此公式也会抛出错误。否则给出正确的 o/p。


    – 

  • 请参阅编辑后的公式。


    – 

公式为A2

=LEN(TEXTSPLIT(BYROW(N(B2:G5<50),CONCAT),1))

或者:

=FIND(1,BYROW(N(B2:G5<50),CONCAT)&1)-1

编辑:最后一个公式不起作用FREQUENCY(),更新了一个更好的版本并参考最后一个例子


=XMATCH(0,HSTACK(SCAN(0,B2:G2>=50,LAMBDA(x,y,y*(x+1))),0))-1

5

  • 1
    此公式可计算出值 >50 的连续单元格的最大数量。例如,在第一行,o/p 应为 1。但如果在 10 月 22 日和 10 月 21 日还有 2 个值 >50,则公式将计算出 o/p 为 2。


    – 

  • @user3471438 完美,我以为现在才编辑。


    – 

  • 好的……这有效。但随机性很强。大约 50% 的情况给出 #N/A o/p。有什么想法吗?


    – 

  • @user3471438 我怎么知道你有什么,我不能简单地假设,当你编辑的时候我已经提出了我的解决方案。难道它不应该是>=50你的帖子所描述的那样,>50因为两者是不同的。


    – 


  • 1
    找到原因了。如果整个范围 >50,则会出现错误。否则计数正常。


    – 

您可以使用BYROWSCAN

=BYROW(SCAN(0,A1:D4,LAMBDA(a,b,IF(b>50,a+1,a*0))),LAMBDA(y,MAX(y)))

1

  • 3
    这也使 o/p 作为连续单元格值的最高计数 >50。所需的 o/p 仅从左侧连续计数。


    – 

与@Black Cat 的逻辑相同,只需找到第一个小于 50 的条目:

=BYROW(B2:G7,LAMBDA(r,XMATCH(TRUE,HSTACK(r,0)<50)-1))


顺便说一句,您可以让 Frequency 工作,这是使用旧版 Excel 的一种方式。通常,结果位于频率数组的第一个元素中,但是当一行中的所有单元格都大于或等于 50 时,总计数位于数组的第二个元素中。您可以这样做:

=INDEX(FREQUENCY(IF(B2:G2>=50,COLUMN(B2:G2)),IF(B2:G2<50,COLUMN(B2:G2))),1+AND(B2:G2>=50))

2

  • 2
    只是为了好玩:=BYROW(B2:G5,LAMBDA(r,XMATCH("^[1-4]?\d$",r,3)))


    – 


  • 1
    我不知道你可以在 xmatch 中使用模式匹配…好吧,公平地说,这是最近才有的。


    – 


=BYROW(B2:G5,LAMBDA(r, XMATCH(TRUE,r<50)-1))