如何用Excel公式简洁合并连续列中每行的最后非空单元格值
如何用Excel公式简洁合并连续列中每行的最后非空单元格值
嗨,我来帮你搞定这个Excel公式的需求!从你的描述和示例来看,你想要先把每列空白单元格用上方最近的非空值填充,再合并每行的有效内容,对吧?下面分两种情况给你提供解决方案,适配不同版本的Excel:
一、Excel 365/2021(支持动态数组):简洁高效版
如果你用的是新版本Excel,直接用动态数组公式就能一步到位,完全符合你想要的“简洁”要求:
先实现列方向的非空值填充
假设你的源数据在A1:C6区域,要把每列的空白单元格用上方最近的非空值填充,输入下面的公式:=BYCOL(A1:C6,LAMBDA(c,SCAN("",c,LAMBDA(a,v,IF(v<>"",v,a)))))这个公式会逐列处理:用
SCAN函数遍历每一列,遇到非空值就更新“记忆值”,空白单元格就沿用之前的记忆值,正好得到你示例里的填充后数组:{1,0,0;1,2,0;1,2,3;4,0,0;4,5,0;4,5,6}(注:如果你的空白是用
0表示的,把公式里的v<>""改成v<>0即可)合并每行的内容
要直接得到合并后的最终结果,把上面的公式嵌套进BYROW和TEXTJOIN里就行:=BYROW(BYCOL(A1:C6,LAMBDA(c,SCAN("",c,LAMBDA(a,v,IF(v<>"",v,a))))),LAMBDA(r,TEXTJOIN("",TRUE,r)))这个公式会自动遍历每行,把填充后的内容合并成连续的字符串,比如第三行得到
123,第六行得到456,完美匹配你的预期。
二、旧版Excel(不支持动态数组):兼容版
如果你的Excel版本比较旧,没法用动态数组函数,可以用数组公式结合LOOKUP和TEXTJOIN来实现:
比如要获取第一行的合并结果,输入下面的公式后按Ctrl+Shift+Enter(数组公式专属输入方式):
=TEXTJOIN("",TRUE,IF(COLUMN(A1:C1)<=MAX(IF(A$1:A1<>"",COLUMN(A$1:A1),0)),INDEX(A$1:C1,MAX(IF(A$1:A1<>"",ROW(A$1:A1),0)),COLUMN(A1:C1)),""))
然后下拉填充到所有行即可。不过这个公式相对繁琐,还是更推荐用新版本的动态数组方案。
你之前想到的LOOKUP找单列最后非空、TEXTJOIN合并的思路完全正确,上面的公式就是把这些逻辑和列方向的遍历填充整合起来啦。
备注:内容来源于stack exchange,提问作者8平民
相关产品推荐
相关产品推荐

