分享

一个多重文本替换问题(1) - Excel函数式编程

 ExcelEasy 2024-07-26 发布于北京


问题

问题很简单。

就是有一个表格,需要替换其中的部分文本。

我第一反应就是嵌套循环。

首先循环左表(原文本),对于左表中的每一行,循环右表,完成右表中的每个替换要求。

既然都是按行循环,就可以使用BYROW函数

比如,我们可以这么写公式:

=LET(    data, B2:B6,    repl_arr, E2:F7,    BYROW(data,        LAMBDA(r,            BYROW(                repl_arr,                LAMBDA(_r,                    SUBSTITUTE(r, INDEX(_r,1), INDEX(_r, 2))                )            )        )    ))

其中,

data - 原文本

repl_arr,替换要求数组,

第4行的BYROW函数循环原文本区域:data,对于每一行,r,进行内层循环。

第6~11行是内层循环,对于上一层循环的每一行r进行替换。

从逻辑看,似乎没什么大问题。

但是这个函数运行不了,会出错。

因为内层循环BYROW返回的是一个数组。

这样公式返回值就是数组的数组。结果是错误的。

还有......

其实,这个方法还有更大的问题。

对于每一行原文本,它用右边的表中每一个替换要求都做了一遍。

但是每一遍都只是完成了一次替换。

而要求是对原文本进行多次替换,这些替换要求是累加的。

思路

其实,一开始的思路并没有问题:可以使用嵌套循环完成。

不过内层循环有两个要求:

  1. 只能返回一个值

  2. 必须累加所有的替换结果。

满足这两个要求的循环函数就只有REDUCE函数了。

公式如下:

=LET(    data, B2:B6,    repl_arr, E2:F7,    BYROW(data,        LAMBDA(r,            REDUCE(r,                SEQUENCE(ROWS(repl_arr)),                LAMBDA(acc,a,                    LET(                        repl_row, INDEX(repl_arr, a, 0),                        SUBSTITUTE(acc, INDEX(repl_row, 1, 1), INDEX(repl_row, 1, 2))                    )                )            )        )    ))

这是最终结果,

其他

这个问题还有很多其他解决方案,大家不妨一起想一下。欢迎在下方留言交流。

详情咨询客服(底部菜单-知识库-客服)

Excel+Power Query+Power Pivot+Power BI


Power Excel 知识库    按照以下方式进入知识库学习
Excel函数   底部菜单:知识库->Excel函数

自定义函数  底部菜单:知识库->自定义函数

Excel如何做  底部菜单:知识库->Excel如何做

面授培训  底部菜单:培训学习->面授培训

Excel企业应用  底部菜单:企业应用

也可以在历史文章中学习Excel,Power Query,Power Pivot,Power BI,Power Automate各种技巧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章