上次我们介绍了一个多重文本替换的问题(一个多重文本替换问题(1) - Excel函数式编程),我们使用双重循环完成了要求。 视频留言中有几位朋友给出了其他的方法,都很好。其中有一位朋友是先将源数据合并成一个字符串,然后循环替换。最后拆分的方式尤其好,是我比较推荐的思路。 今天介绍一个用递归解决这个问题的方法。 用递归解决问题其实很简单,我之前介绍过不少这方面的内容(比如这里),前提是需要先有对问题的递归定义。 原来的问题如下: 左表是源数据,其中的文本需要替换,规则是在右表中第一列的单词替换成第二列的单词。 分析 我们以B2为例, Lorem ipsum dolor sit amet, 其中的ipsum需要替换为xpsum,dolor需要替换为dplor。 我们以str表示待替换的字符串, 以replArr表示右边的规则数组, i表示当前替换到的规则数组中的序号, 函数replFunc表示替换函数, 那么,
表示已经使用规则数组replArr中的第 i 条规则(即已经用前 i 条规则完成了替换),如果 i = 5,也就表示我们完整了整个替换, 那么这个替换从逻辑上就可以表示为: "先用这个函数去完成前 i - 1条规则的替换,然后对结果进行第 i 条规则的替换", 写成公式就是,
这就是这个逻辑的递推关系,据此,就可以写出递归定义:
第4~9行就是递归定义。这里我们多使用了一个me参数,是为了在LET函数中使用自定义递归函数(具体原因请参见为什么递归函数用不了?- Excel 函数式编程) 上面的公式中,我们最后调用replFunc时,仅仅对B2进行了替换。 但是我们要替换的是一个区域中所有的字符串。 是否需要再使用一个递归函数呢? 当然可以再为左表定义一个递归函数。 不过完全用不到。因为考察我们对replFunc这个函数的定义,会发现其中的x是支持数组的,于是,我们可以直接将最后一行(第10行)改成对data的引用,
结果如下: 详情咨询客服(底部菜单-知识库-客服) Excel+Power Query+Power Pivot+Power BI 自定义函数 底部菜单:知识库->自定义函数 面授培训 底部菜单:培训学习->面授培训 Excel企业应用 底部菜单:企业应用 |
|