上个周五,我在微头条上发了一个问题,是关于上班天数统计的,今天把这个问题的解决思路补上。
问题是这样的,如下图所示,统计图中每个人最后一个“年”或者最后一个“假”后面的“上”的数量,年和假的位置不定,数量不定,可能是连续的也可能是不连续的。
解决这个问题需要分几个步骤:
- 确定最后一个“年”或者“假”在每一行中的位置;
- 如何从该位置的后一个单元格开始统计;
我们一步一步来,先来解决第一个问题:
确定最后一个“年”或“假”的位置
山重水复疑无路
定位一个特定的值在一行中的位置,我首先想到的是MATCH函数,结果发现不行,因为MATCH函数只能定位到该“值”在行中第一次出现的位置,然后我又想到再用COUNTIF函数统计一下这个“值”出现的次数再与MATCH函数确定的位置相加不就行了。
结果很打脸,还是不行,因为这个“值”在这一行中不仅次数不定,也不一定是连续出现的,看来这个思路不行,只能换一个思路了。
柳暗花明又一村
然后,我就想既然不能确定最后一个“年”的位置,那我能不能找到所有“年”的位置,然后我翻了一下我以前的文章,又去网上搜了一下,发现还真可以,那就是使用“数组”。
如上图所示,我们在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所对应的列号数值组成的数组;
最后的计算结果为:{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函数的第一参数。
公式输入完毕后,记得要用Ctrl + Shift + 回车 的方式确认输入。
好了,现在我们搞定了“年”,剩下的“假”就很简单了,因为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))),"上")
虽然公式很复杂,但只要我们能熟知函数的参数,还是能够看懂并熟练运用的。