前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开工大吉!Excel巧算连续打卡最长的天数

开工大吉!Excel巧算连续打卡最长的天数

作者头像
fanjy
发布2022-03-07 17:53:20
1K0
发布2022-03-07 17:53:20
举报
文章被收录于专栏:完美Excel完美Excel

标签:Excel公式练习

打卡,已经成为我们这个时代的热词。上班打卡,下班打卡,跑步打卡,健身打卡,阅读打卡……,确实,通过打卡能够激励我们坚持做一件事情。然而,有时由于各种原因,我们可能偶尔会中断打卡,那么,我们要知道在打卡记录中,连续打卡(也就是坚持)的最长天数,应该怎么做呢?这就是今天我们想要用公式来解决的问题。

示例数据如下图1所示。TRUE表示打开成功,FALSE表示没有打卡。

图1

注:你可以到知识星球完美Excel社群下载示例数据工作簿,也可以自己制作一个。示例数据来源chandoo.org。

希望使用公式得到:

1.连续打卡的最长天数

2.最长坚持打卡是从哪里开始的

这里的关键是找出由TRUE变到FALSE或者由FALSE变到TRUE的位置。可以错位比较,找出单元格值变化的位置。

各块开始的位置:

代码语言:javascript
复制
SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245)

各块结束的位置:

代码语言:javascript
复制
SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)

两者相减,即为各块长度:

代码语言:javascript
复制
SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245)

其中,有错误值,使用IFERROR函数将其转换为0:

代码语言:javascript
复制
IFERROR(SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245),0)

取其最大值,加上1,即为连续最长天数。

代码语言:javascript
复制
=MAX(IFERROR(SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245),0))+1

这是一个数组公式,输入完后要按Ctrl+Shift+Enter组合键。

下面求开始位置。

在得到由各区间天数组成的数组后:

代码语言:javascript
复制
IFERROR(SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245),0)

在其中查找最长天数出现的位置:

代码语言:javascript
复制
MATCH(F6-1, IFERROR(SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245),0),0)

然后在数组:

IF(C4:C243<>C5:C244,B5:B244)

中查找最小值,即为最长天数开始的位置

完整的公式为:

=SMALL(IF(C4:C243<>C5:C244,B5:B244),MATCH(F6-1, IFERROR(SMALL(IF(C6:C245<>C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244<>C5:C245,B5:B245),B5:B245),0),0))

这是一个数组公式,输入完后要按Ctrl+Shift+Enter组合键。

如果我们使用名称,那么公式将会更简单。

名称:id

引用位置:B5:B244

名称:list

引用位置:C5:C244

名称:size

引用位置:=COUNTA(list)

名称:list.a

引用位置:=OFFSET(list,-1,0,size)

名称:list.b

引用位置:=OFFSET(list,1,0,size)

这样,求出连续打卡最长天数公式:

=MAX(IFERROR(SMALL(IF(list.b<>list,id),id)-SMALL(IF(list.a<>list,id),id), 0))+1

最长天数开始位置:

=SMALL(IF(list.a<>list,id),MATCH(F6-1,IFERROR(SMALL(IF(list.b<>list,id),id)-SMALL(IF(list.a<>list,id),id), 0),0))

注意,以上都是数组公式,输入完后要按Ctrl+Shift+Enter组合键。

Bug:本示例假设连续打卡的天数总是大于连续中断的天数,否则上述结果不正确。

下面是更酷的公式。

连续打卡最长天数:

=MAX(FREQUENCY(IF(list,id),IF(list,,id)))

最长天数开始位置:

=MATCH(F20,FREQUENCY(IF(list,id),IF(list,,id)),)-F20

这些都是数组公式,输入完后要按Ctrl+Shift+Enter组合键。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档