上个周五,我在微头条上发了一个问题,是关于上班天数统计的,今天把这个问题的解决思路补上 。
问题是这样的,如下图所示,统计图中每个人最后一个“年”或者最后一个“假”后面的“上”的数量,年和假的位置不定,数量不定,可能是连续的也可能是不连续的 。

解决这个问题需要分几个步骤:
- 确定最后一个“年”或者“假”在每一行中的位置;
- 如何从该位置的后一个单元格开始统计;
确定最后一个“年”或“假”的位置
- 山重水复疑无路
结果很打脸 , 还是不行,因为这个“值”在这一行中不仅次数不定,也不一定是连续出现的,看来这个思路不行,只能换一个思路了 。
- 柳暗花明又一村

如上图所示,我们在AH3单元格输入公式,输入完毕后,按住Ctrl和Shift键,再按回车确定 。:
=IF(B3:AF3="年",COLUMN(B3:AF3),0)
这样我们就得到了一个数组公式 , 实际的结算结果如上图所示:
IF函数的第一个参数:B3:AF3="年"计算后会得到一个由False和True组成的数组,把B3到AF3单元格的值与“年”进行比较,当值为“年”是返回True,否则返回False;
IF函数的第二个参数:COLUMN(B3:AF3)计算后会得到从B3到AF3所对应的列号数值组成的数组;
【Excel函数的综合应用:年休结束后,连续上班的天数如何统计】最后的计算结果为:{0,0,0,0,0,0,0,0,0,0,0,13,14,15,16,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},即:
当第一参数返回的数组中返回值为TRUE时,则返回第二参数数组对应位置的值,否则返回第三参数0 。
虽然我们得到了所有“年”的位置,但是这个结果我们还不能直接拿来用 , 因为我只需要最后一个“年”的位置 。
既然我已经得到了所有的“年”的位置,那再从这些结果里取出最后一个年的位置就很简单了 , 我们只需要取出这个结果中的最大值就可以了 。
既然是取最大值,那当然是用MAX函数了 , 所以,只需要在上面的公式外面套上一层MAX函数,就能够得到我想要的结果了 。
=MAX(IF(B3:AF3="年",COLUMN(B3:AF3),0))使用组合键 Ctrl Shift Enter 确认输入后得到最后的结果 。
从该位置的后一个单元格开始统计
通过前面的方法,我得到了最后一个“年”在行中的位置 , 现在就要想办法把这个好不容易得到的结果给用上,我脑子里第一个想到的函数是INDIRECT,这个函数可以把字符串转换为单元格地址并返回该单元格的值,实际上我也用这个方法解决了问题,但整个方法太复杂了,还需要搭配ADDRESS函数一起使用(有兴趣的朋友可以自己试试,如果想要这个解决方法,可以私信或者评论区留言) 。我们今天用另外一种简单点的方法来解决这个问题,那就是用OFFSET函数加COUNTIF函数来完成最后的绝杀,公式如下: 。
=COUNTIF(OFFSET(A3,,MAX(IF(A3:AF3="年",COLUMN(A3:AF3),0)),,MIN(COLUMN(AF1)-IF(A3:AF3="年",COLUMN(A3:AF3),0))),"上")看到上面一长串的公式是不是眼睛晕头更晕,没事,我现在就把它解剖了给你们看,一看就明白了 。

如上图,红色的部分都是OFFSET函数的参数,不管这个参数有多长,它都会作为一个整体单独计算,然后将计算的结果返回并作为OFFSET函数的参数值参与OFFSET函数的计算 。
OFFSET函数的计算结果见下图(OFFSET函数的用法可以自行搜索):

蓝色的部分则是COUNTIF函数的参数,而OFFSET函数的返回值就是COUNTIF函数的第一参数 。
公式输入完毕后 , 记得要用CtrlShift回车 的方式确认输入 。
好了,现在我们搞定了“年”,剩下的“假”就很简单了,因为MAX函数是可以有很多参数的,所以我们只需要把第一步的函数修改一下,放进MAX函数里作为MAX函数的第二参数即可,这样我们就得到了最终的公式:
=COUNTIF(OFFSET(A3,,MAX(IF(A3:AF3="年",COLUMN(A3:AF3),0),IF(A3:AF3="假",COLUMN(A3:AF3),0)),,MIN(COLUMN(AF1)-IF(A3:AF3="年",COLUMN(A3:AF3),0),COLUMN(AF1)-IF(A3:AF3="假",COLUMN(A3:AF3),0))),"上")虽然公式很复杂,但只要我们能熟知函数的参数,还是能够看懂并熟练运用的 。
我是Excel大白,欢迎大家在评论区留言提问,发表自己的看法 。
