上次我們介紹了一個(gè)多重文本替換的問題(一個(gè)多重文本替換問題(1) - Excel函數(shù)式編程),我們使用雙重循環(huán)完成了要求。 視頻留言中有幾位朋友給出了其他的方法,都很好。其中有一位朋友是先將源數(shù)據(jù)合并成一個(gè)字符串,然后循環(huán)替換。最后拆分的方式尤其好,是我比較推薦的思路。 今天介紹一個(gè)用遞歸解決這個(gè)問題的方法。 用遞歸解決問題其實(shí)很簡(jiǎn)單,我之前介紹過不少這方面的內(nèi)容(比如這里),前提是需要先有對(duì)問題的遞歸定義。 原來的問題如下: 左表是源數(shù)據(jù),其中的文本需要替換,規(guī)則是在右表中第一列的單詞替換成第二列的單詞。 分析 我們以B2為例, Lorem ipsum dolor sit amet, 其中的ipsum需要替換為xpsum,dolor需要替換為dplor。 我們以str表示待替換的字符串, 以replArr表示右邊的規(guī)則數(shù)組, i表示當(dāng)前替換到的規(guī)則數(shù)組中的序號(hào), 函數(shù)replFunc表示替換函數(shù), 那么,
表示已經(jīng)使用規(guī)則數(shù)組replArr中的第 i 條規(guī)則(即已經(jīng)用前 i 條規(guī)則完成了替換),如果 i = 5,也就表示我們完整了整個(gè)替換, 那么這個(gè)替換從邏輯上就可以表示為: "先用這個(gè)函數(shù)去完成前 i - 1條規(guī)則的替換,然后對(duì)結(jié)果進(jìn)行第 i 條規(guī)則的替換", 寫成公式就是,
這就是這個(gè)邏輯的遞推關(guān)系,據(jù)此,就可以寫出遞歸定義:
第4~9行就是遞歸定義。這里我們多使用了一個(gè)me參數(shù),是為了在LET函數(shù)中使用自定義遞歸函數(shù)(具體原因請(qǐng)參見為什么遞歸函數(shù)用不了?- Excel 函數(shù)式編程) 上面的公式中,我們最后調(diào)用replFunc時(shí),僅僅對(duì)B2進(jìn)行了替換。 但是我們要替換的是一個(gè)區(qū)域中所有的字符串。 是否需要再使用一個(gè)遞歸函數(shù)呢? 當(dāng)然可以再為左表定義一個(gè)遞歸函數(shù)。 不過完全用不到。因?yàn)榭疾煳覀儗?duì)replFunc這個(gè)函數(shù)的定義,會(huì)發(fā)現(xiàn)其中的x是支持?jǐn)?shù)組的,于是,我們可以直接將最后一行(第10行)改成對(duì)data的引用,
結(jié)果如下: 詳情咨詢客服(底部菜單-知識(shí)庫(kù)-客服) Excel+Power Query+Power Pivot+Power BI 自定義函數(shù) 底部菜單:知識(shí)庫(kù)->自定義函數(shù) 面授培訓(xùn) 底部菜單:培訓(xùn)學(xué)習(xí)->面授培訓(xùn) Excel企業(yè)應(yīng)用 底部菜單:企業(yè)應(yīng)用 |
|