
需求
Excel中如何查找一组数据中第一个大于0的数据所在的位置?
原始数据
该数据为某平台不同客户在每天的消费情况。其中A列为账户名称,B-G列为每天的消费。

预期结果
找出每个账户首次消费的日期(第一个大于0的日期)填入H列。

操作步骤
方法一
在H2单元格中输入公式
=INDEX($B$1:$G$1,1,MATCH(TRUE,B2:G2>0,0))。

按住Ctrl+Shift+Enter执行公式。
将H2中的公式向下拖动,填充其他单元格即可。

方法二
在H2单元格中输入公式
=INDEX($B$1:$G$1,MATCH(1,SIGN(B2:G2),0))。按住Ctrl+Shift+Enter执行公式。
将H2中的公式向下拖动,填充其他单元格即可。
公式解析
两个方法原理相通,都是先用match函数找到第一个大于0的数字的位置,然后再用index函数获得对应位置的日期。因此该函数的关键在于如何找到一组数字中第一个大于0的数字。match函数可以获得某值在一组值中第一次出现的位置。下面以方法一H2中的公式为例,逐步拆解:
MATCH(TRUE,B2:G2>0,0)
B2:G2>0的结果是一个数组{FALSE,FALSE,TRUE,TRUE,TRUE,TRUE},即B2、C2、D2、E2、F2、G2与0相比较的结果。如果大于0返回TRUE,否则返回FASLE。

所以MATCH(TRUE,B2:G2>0,0)即等价于MATCH(TRUE,{FALSE,FALSE,TRUE,TRUE,TRUE,TRUE},0)表示在{FALSE,FALSE,TRUE,TRUE,TRUE,TRUE}中第一个TRUE的位置,即3。
INDEX($B$1:$G$1,1,3)
该函数表示B1:G1,日期行中第三个日期,即2023/10/3。
至此账户A首次消费日结果已经出来了。
SIGN(B2:G2)
SING(正数) 会输出1,SING(负数) 会输出-1,SING(零) 会输出0.
该函数输出的结果其实为数组{0,0,1,1,1,1},相当于将查找首次大于0转换成首次查找1。

总结
该需求实现的核心其实是使用数组将查找大于0这个不太好实现的表达转换成查找某个固定值。其中方法一是转化成查找TRUE,方法二是转化成查找1。