一、需求描述
將對應數據不為空的字段篩選出來放在新的列里
二、解析
=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網址