如何修改LOOKUP公式获取Excel列中首个非0值?
问题场景
以下是数据表格:
| A | B | |
|---|---|---|
| 1 | 0 | 500 |
| 2 | 0 | |
| 3 | 0 | |
| 4 | 500 | |
| 5 | 400 | |
| 6 | 0 | |
| 7 | 700 | |
| 8 | 300 | |
| 9 |
需求:在单元格B1中显示A列里首个不为0的值(示例中应为500)。
尝试的公式(未成功):
B1 =LOOKUP(2,1/(A1:A8<>0),A1:A8)
问题原因
你的LOOKUP公式之所以返回错误结果,是因为LOOKUP函数的特性:它会在查找数组中找到最后一个小于等于查找值(这里是2)的匹配项。1/(A1:A8<>0)生成的数组中,非0值对应位置为1,0值对应位置为#DIV/0!,LOOKUP会忽略错误值,最终返回最后一个1对应的A列值(即300),而非第一个。
正确解决方案
方案1:INDEX + MATCH(兼容所有Excel版本)
这是通用度最高的方法,适用于所有Excel版本:
=INDEX(A1:A8, MATCH(TRUE, A1:A8<>0, 0))
A1:A8<>0生成布尔数组,非0值为TRUE,0值为FALSEMATCH(TRUE, ..., 0)定位第一个TRUE的位置(示例中为第4行)INDEX(A1:A8, 位置)返回该位置对应的A列值(500)
注:若使用旧版Excel(非365/2021),输入公式后需按
Ctrl+Shift+Enter完成数组公式的确认。
方案2:XLOOKUP(适用于Excel 365/2021及以上版本)
如果你的Excel支持XLOOKUP函数,可使用更简洁的写法:
=XLOOKUP(TRUE, A1:A8<>0, A1:A8, , , 1)
- 最后一个参数
1表示从前往后搜索,直接返回第一个匹配的非0值
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

