在下表,要找第一个不为零的数据的值或者所在的位置,如何设置: 6/20 | 6/21 | 6/22 | 6/23 | 首个不为零的值 | 所在位置 | | | | 85 | | | | 15 | 20 | 25 | | | | | 36 | 45 | | | | | | 23 | | | 45 | 46 | 47 | 32 | | | | 67 | 60 | 66 | | | | 46 | 50 | 54 | | |
找第一个不为零的数所在的位置用数组公式{=MATCH(1,1/(A22<>0),0)},比如A22里只有D2是不为零的,那前面3个单元格参与“1/单元格数值”得到的都是错误值,第四个这1/1=1,用match函数找1所在的位置,返回结果为4. 那要找首个不为零的值自然就简单了,可以用index(A2:D2,位置),维护完整就是公式:{=INDEX(A22,MATCH(1,1/(A22<>0),0)) }。当然我们也可以用offset函数来实现,本案例可以设置公式:{=OFFSET($A1,1,MATCH(1,1/(A22<>0),0)-1) }。 PS:上述有{}的公式,是输入公式后,按ctrl+shift+enter就可以完成数组公式的输入,{}是自动加上去的。 这让我想起了2013年6月份的时候,生管部的经理来找我问的一个问题,希望把工单第一个入库日期找出来。案例如下: 工单号 | 产品编码 | 产品型号 | 第一次入库 | 6/20 | 6/21 | 6/22 | 6/23 | 6/24 | | AA1 | | | | | | 85 | 15 | | AA2 | | | | 15 | 20 | 25 | 10 | | AA3 | | | | | 36 | 45 | 9 | | AA4 | | | | | | 23 | 77 | | AA5 | | | 45 | 46 | 47 | 32 | | | AA6 | | | | 67 | 60 | 66 | 68 | | AA7 | | | | 46 | 50 | 54 | |
我设置的公式是:{=OFFSET($D$1,0,MATCH(1,1/(E2:I2<>0),0)) }。 还给她做了非常详细的解释呢,我也希望广大财务同仁能把为业务服务的精神发扬光大,所以把解释文字也分享如下: 公式解释:
=OFFSET($D$1,0,MATCH(1,1/(E2:I2<>0),0)) 1、数组公式的match(1,1/(E2:I2<>0),0)
里,我们可以一步步分析: (E2:I2<>0)得到的结果是:{FALSE,FALSE,FALSE,TRUE,FALSE},而1/(E2:I2<>0)对应的结果是1/{FALSE,FALSE,FALSE,TRUE,FALSE},继续运算之后,得到的结果是:{#DIV/0!,#DIV/0!,#DIV/0!,1,#DIV/0!}
注:FALSE参与运算当成0,TRUE参与运算当成1.
我们可以发现第4个数是1,其余都是为零。
MATCH(1,1/(E2:I2<>0),0)这个函数是在数组的结果{#DIV/0!,#DIV/0!,#DIV/0!,1,#DIV/0!} 里去找1所在的位置,参数0,代表这个数组不排序。找出来的结果是4.
2、
offset函数是位移,表达式如下: offset(reference,rows,cols,height,width),该函数的作用是是从参照reference单元格,向下移动rows行,右移动cols列,确定左上角。
然后从左上角开始确定区域的高height(行数)和宽width(列数),我们只要一个单元格的值,所以,高height(行数)和宽width(列数)都是1,如果是1可以省略不写的。所以,从D1单元格,向下移动0行,右移动4列,即可得到对应的值。高与宽不用填,上文提到过。 |