计算连续的单元格值并重置单元格值更改的计数

Count continuous cell vallues and reset the count if the cell value changes

在 Excel 或 Google 表格中,我想实现类似习惯跟踪器的功能。

例:让X想连续锻炼30天。

他将输入是否在特定的一天进行了锻炼,输入“是”表示做,“否”表示不做。

我只想统计连续的"Yes"个数。

如果他在中间输入 "No" 一天,那么他接下来输入的任何 "Yes" 将从 0 开始计数。

我需要在顶行显示连续日期的计数。 例如,如果他做了 10 天的练习,我想将其显示在顶行,以便最终用户在需要时可以一目了然。

希望我清楚。

注意:最终用户不会在每个单元格中输入公式来计算计数。 我只想输入一次公式。它应该独立于行。

您需要创建一个将当前值与 'yes' 进行比较的公式,如果是 TRUE 则进行递增,如果不设置为 0.

下面是 C3 单元格中的公式示例,假设您在 B 列中有 yes/no:

=IF(B3="yes", C2+1, 0)

如果您只需要最后一个值,则在 D1 中输入以下公式,例如:

=INDEX(B:C,COUNTA(B:B),2)

这是 google 表格中的示例,灵感来自 this post:

C2中的公式:

=ARRAYFORMULA(IF(B2:B32="Yes",MMULT(N(ROW(B2:B32)>=TRANSPOSE(ROW(B2:B32))),N(B2:B32="Yes"))-HLOOKUP(0,MMULT(N(ROW(B2:B32)>TRANSPOSE(ROW(B2:B32))),N(B2:B32="Yes")),MATCH(VLOOKUP(ROW(B2:B32),IF(N(B2:B32<>B1:B31),ROW(B2:B32),),1,TRUE),VLOOKUP(ROW(B2:B32),IF(N(B2:B32<>B1:B31),ROW(B2:B32),),1,TRUE),0),FALSE),))

只能输入一个公式。

并使其独立于行(无论天数如何):

=ArrayFormula(IF(B2:index(B:B,counta(A:A))="Yes",MMULT(N(ROW(B2:index(B:B,counta(A:A)))>=TRANSPOSE(ROW(B2:index(B:B,counta(A:A))))),N(B2:index(B:B,counta(A:A))="Yes"))-HLOOKUP(0,MMULT(N(ROW(B2:index(B:B,counta(A:A)))>TRANSPOSE(ROW(B2:index(B:B,counta(A:A))))),N(B2:index(B:B,counta(A:A))="Yes")),MATCH(VLOOKUP(ROW(B2:index(B:B,counta(A:A))),IF(N(B2:index(B:B,counta(A:A))<>B1:index(B:B,counta(A:A)-1)),ROW(B2:index(B:B,counta(A:A))),),1,TRUE),VLOOKUP(ROW(B2:index(B:B,counta(A:A))),IF(N(B2:index(B:B,counta(A:A))<>B1:index(B:B,counta(A:A)-1)),ROW(B2:index(B:B,counta(A:A))),),1,TRUE),0),FALSE),))

或者,如果您不关心电子表格的速度:

=ArrayFormula(IF(B2:B="Yes",MMULT(N(ROW(B2:B)>=TRANSPOSE(ROW(B2:B))),N(B2:B="Yes"))-HLOOKUP(0,MMULT(N(ROW(B2:B)>TRANSPOSE(ROW(B2:B))),N(B2:B="Yes")),MATCH(VLOOKUP(ROW(B2:B),IF(N(B2:B32<>B1:B),ROW(B2:B),),1,TRUE),VLOOKUP(ROW(B2:B),IF(N(B2:B<>B1:B),ROW(B2:B),),1,TRUE),0),FALSE),))

如果您对 "Yes" 的最后一个序列的最后一个值感兴趣,您可以使用此公式检索该值:

=INDEX(C:C,MATCH(9.99E+307,C:C))
=ARRAYFORMULA(QUERY(IF(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes", 
 MMULT(N(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1))>=
 TRANSPOSE(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)))), 
 N(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes"))-HLOOKUP(0, 
 MMULT(N(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1))>
 TRANSPOSE(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)))), 
 N(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes")), MATCH(
 VLOOKUP(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), 
 IF(N(INDIRECT("B2:B"&COUNTA(B2:B)+1)<>B1:B), 
 ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), ), 1, 1),
 VLOOKUP(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), 
 IF(N(INDIRECT("B2:B"&COUNTA(B2:B)+1)<>B1:B), 
 ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), ), 1, 1), 0), 0), ), 
 "where Col1 is not null offset "&COUNTIF(B2:B, "yes")-1, 0))


=ARRAYFORMULA(QUERY(IF(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes", 
 MMULT(N(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1))>=
 TRANSPOSE(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)))), 
 N(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes"))-HLOOKUP(0, 
 MMULT(N(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1))>
 TRANSPOSE(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)))), 
 N(INDIRECT("B2:B"&COUNTA(B2:B)+1)="Yes")), MATCH(
 VLOOKUP(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), 
 IF(N(INDIRECT("B2:B"&COUNTA(B2:B)+1)<>B1:B), 
 ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), ), 1, 1),
 VLOOKUP(ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), 
 IF(N(INDIRECT("B2:B"&COUNTA(B2:B)+1)<>B1:B), 
 ROW(INDIRECT("B2:B"&COUNTA(B2:B)+1)), ), 1, 1), 0), 0), 0), 
 "offset "&COUNTIF(B2:B, "<>")-1, 0))