计算连续的单元格值并重置单元格值更改的计数
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))
在 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))