如何修改XLOOKUP公式获取每行第二个非空单元格的值?
问题背景
数据表格
| A | B | 2023年销售额 | 2023年利润率 | E | 2024年销售额 | 2024年利润率 | H | 2025年销售额 | 2025年利润率 | K | 结果 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 产品 | 2023年销售额 | 2023年利润率 | 2024年销售额 | 2024年利润率 | 2025年销售额 | 2025年利润率 | 结果 | ||||
| 2 | 产品A | 500 | 30% | 150 | 40% | 160 | 5% | 30% | ||||
| 3 | 产品B | 200 | 10% | 900 | 60% | 750 | 8% | 10% | ||||
| 4 | 产品C | 300 | 19% | 400 | 10% | 400 | 60% | 19% | ||||
| 5 | 产品D | 700 | 50% | 930 | 25% | 50% | ||||||
| 6 | 产品E | 800 | 15% | 15% | ||||||||
| 7 | 产品F | 430 | 32% | 32% | ||||||||
| 8 | 产品G | 360 | 45% | 45% |
需求说明
希望在L列中显示每个产品的首个利润率,即每行的第二个非空单元格。当前使用公式=XLOOKUP(TRUE,ISNUMBER(C2:J2),C2:J2)可正确获取每行第一个非空数值单元格(首个销售额),需修改公式以获取第二个非空数值单元格。
解决方案
方案1:INDEX + FILTER(推荐,Excel 365及以上版本)
直接筛选出当前行所有非空数值单元格,再提取第二个元素:
=INDEX(FILTER(C2:J2,ISNUMBER(C2:J2)),2)
逻辑清晰:FILTER先提取行内所有数值型非空单元格,形成动态数组;INDEX定位数组的第二个元素,正好对应首个利润率。
方案2:XLOOKUP + COUNTIF(兼容更多Excel版本)
通过统计区域内非空数值的数量,匹配第二个符合条件的单元格:
=XLOOKUP(2,COUNTIF(OFFSET(C2,0,0,1,COLUMN(C2:J2)-COLUMN(C2)+1),">0"),C2:J2)
原理:OFFSET生成从C2到当前列的动态区域,COUNTIF统计每个区域内非空数值的数量,当数量等于2时,XLOOKUP匹配对应位置的单元格。
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

