一、需求描述
将对应数据不为空的字段筛选出来放在新的列里
二、解析
=IFERROR(INDEX(B$2:B$10,SMALL(IF(C$2:C$10<>"",ROW(C$2:C$10)-ROW(C$2)+1),ROW(A1))),"")
1. IF(C$2:C$10<>"", ROW(C$2:C$10)-ROW(C$2)+1)
作用: 检查 C2:C10 是否非空,返回非空单元格的 相对行号(从1开始)。
计算过程: ROW(C2:C10) → 返回绝对行号 {2;3;4;...;10}。 ROW(C2:C10)-ROW(C2)+1 → 转换为相对行号 {1;2;3;...;9}。 如果 C2 为空,则跳过,返回类似 {FALSE;2;3;FALSE;...}。
2. SMALL(..., ROW(A1))
作用: 提取第 n 小的非空行号(n 由 ROW(A1) 决定,下拉时变为 ROW(A2), ROW(A3)...)。
示例: 若 C3 和 C5 非空,首次返回 2(第1小的行号),下次返回 4(第2小的行号)。
3. INDEX(B$2:B$10, ...)
作用: 根据 SMALL 返回的行号,从 B2:B10 中提取对应值。
4. IFERROR(..., "")
作用: 当所有非空值提取完毕时(SMALL 返回错误),显示空值而非 #NUM!。
三、其他补充
1.核心修正点:
行号偏移需 从1开始(+1)。
SMALL 的 k 参数需从 ROW(A1) 开始。 推荐方案:
2.旧版 Excel:
用 方法1 或 方法2,严格按 Ctrl+Shift+Enter 输入。
Excel 365:直接使用 FILTER。
3.deepseek是个很好的工具,感谢!deepseek网址