当前位置:首页>办公设备>考勤机>

考勤机导出数据如何统计考勤天数(考勤机导出数据后怎样快速统计)

考勤机导出数据如何统计考勤天数(考勤机导出数据后怎样快速统计)

更新时间:2021-12-11 01:18:43

上个周五,我在微头条上发了一个问题,是关于上班天数统计的,今天把这个问题的解决思路补上。

问题是这样的,如下图所示,统计图中每个人最后一个“年”或者最后一个“假”后面的“上”的数量,年和假的位置不定数量不定,可能是连续的也可能是不连续的。

解决这个问题需要分几个步骤:

  1. 确定最后一个“年”或者“假”在每一行中的位置;
  2. 如何从该位置的后一个单元格开始统计;

我们一步一步来,先来解决第一个问题:

确定最后一个“年”或“假”的位置
  • 山重水复疑无路

定位一个特定的值在一行中的位置,我首先想到的是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))),"上")

虽然公式很复杂,但只要我们能熟知函数的参数,还是能够看懂并熟练运用的。

我是Excel大白,欢迎大家在评论区留言提问,发表自己的看法。

,