)
在實(shí)際 Excel 數(shù)據(jù)處理中我們經(jīng)常遇到需要根據(jù)一個(gè)或多個(gè)條件查找并返回多個(gè)對(duì)應(yīng)值的場(chǎng)景。傳統(tǒng)的VLOOKUP函數(shù)只能返回單列而INDEXMATCH組合雖然靈活但在處理多值、多列返回時(shí)公式會(huì)變得冗長(zhǎng)且難以維護(hù)。Office 365 和 WPS 最新版本提供的XLOOKUP函數(shù)是解決這類問(wèn)題的利器它原生支持返回?cái)?shù)組能優(yōu)雅地完成多列查找。然而如果你需要處理更復(fù)雜的邏輯比如基于多個(gè)條件進(jìn)行查找或者希望構(gòu)建一個(gè)可復(fù)用的、邏輯清晰的查找工具那么結(jié)合LAMBDA函數(shù)和遞歸思想自己“手搓”一個(gè)增強(qiáng)版的XLOOKUP將是一個(gè)極具價(jià)值的高階技能。本文將帶你深入LAMBDA遞歸的實(shí)戰(zhàn)應(yīng)用一步步構(gòu)建一個(gè)自定義的、功能強(qiáng)大的查找函數(shù)。這個(gè)函數(shù)不僅能實(shí)現(xiàn)多條件匹配還能靈活返回多列數(shù)據(jù)其核心邏輯清晰便于調(diào)試和擴(kuò)展。無(wú)論你是希望深化 Excel/WPS 函數(shù)理解的進(jìn)階用戶還是尋求自動(dòng)化解決方案的數(shù)據(jù)分析師通過(guò)本文你將掌握如何利用現(xiàn)代電子表格的函數(shù)式編程能力打造專屬的數(shù)據(jù)處理利器。我們將從理解遞歸和LAMBDA的基礎(chǔ)開(kāi)始逐步完成函數(shù)的設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試和錯(cuò)誤處理。1. 理解 LAMBDA 與遞歸超越普通函數(shù)的思維在動(dòng)手之前必須厘清兩個(gè)核心概念LAMBDA和遞歸。它們是實(shí)現(xiàn)我們自定義查找函數(shù)的基石。1.1 LAMBDA 函數(shù)定義你自己的計(jì)算單元LAMBDA函數(shù)允許你在 Excel 或 WPS 表格中創(chuàng)建自定義函數(shù)而無(wú)需使用 VBA 宏。你可以將它理解為一個(gè)“公式模板”這個(gè)模板接受輸入?yún)?shù)并基于這些參數(shù)執(zhí)行計(jì)算最后返回一個(gè)結(jié)果。其基本語(yǔ)法為L(zhǎng)AMBDA([parameter1, parameter2, …,] calculation)。例如LAMBDA(x, y, xy)定義了一個(gè)將兩個(gè)參數(shù)相加的函數(shù)。但單獨(dú)寫入單元格它不會(huì)計(jì)算因?yàn)樗枰獏?shù)。通常我們通過(guò)“命名”或“立即調(diào)用”的方式來(lái)使用它。立即調(diào)用在公式后直接提供參數(shù)如LAMBDA(x, y, xy)(5, 3)結(jié)果是 8。命名定義推薦通過(guò)“名稱管理器”給LAMBDA函數(shù)起一個(gè)名字之后就可以像內(nèi)置函數(shù)一樣在工作簿的任何地方使用它。這是構(gòu)建復(fù)雜、可復(fù)用工具的關(guān)鍵。1.2 遞歸函數(shù)調(diào)用自身的藝術(shù)遞歸是一種算法思想一個(gè)函數(shù)在其定義中直接或間接地調(diào)用自身。在LAMBDA的上下文中這意味著我們定義的LAMBDA函數(shù)可以在其計(jì)算邏輯中引用它自己的名稱。例如計(jì)算階乘n! n * (n-1)!且0! 1。我們可以用遞歸LAMBDA來(lái)實(shí)現(xiàn)Factorial LAMBDA(n, IF(n0, 1, n * Factorial(n-1)))這個(gè)名為Factorial的函數(shù)會(huì)不斷調(diào)用自身直到n減至 0觸發(fā)終止條件IF(n0, 1, ...)然后逐層返回計(jì)算結(jié)果。在查找場(chǎng)景中遞歸非常適合處理“遍歷”邏輯。我們可以從查找區(qū)域的第一行開(kāi)始檢查是否匹配條件如果匹配則收集結(jié)果然后遞歸地檢查下一行直到區(qū)域末尾。1.3 為何選擇 LAMBDA 遞歸而非傳統(tǒng)數(shù)組公式傳統(tǒng)數(shù)組公式如INDEX(SMALL(IF(...), ROW(INDIRECT(...))), ...)在處理多值查找時(shí)非常強(qiáng)大但公式往往冗長(zhǎng)、嵌套深、難以閱讀和調(diào)試。一旦邏輯需要調(diào)整修改成本很高。LAMBDA遞歸方案的優(yōu)勢(shì)在于邏輯封裝將復(fù)雜的查找邏輯封裝在一個(gè)命名的LAMBDA函數(shù)內(nèi)工作表單元格公式變得極其簡(jiǎn)潔例如MyXLOOKUP(條件1, 條件2, 返回區(qū)域)。易于調(diào)試你可以單獨(dú)測(cè)試LAMBDA函數(shù)內(nèi)部的每一步邏輯??蓮?fù)用性一次定義全工作簿通用??勺x性通過(guò)合理的參數(shù)命名和注釋函數(shù)意圖更清晰。2. 環(huán)境準(zhǔn)備與核心思路設(shè)計(jì)在開(kāi)始編寫代碼之前確保你的環(huán)境支持所需功能并明確我們要構(gòu)建的函數(shù)的目標(biāo)。2.1 軟件與環(huán)境要求Excel: 需要 Microsoft 365 訂閱版或 Excel 2021 及以上版本以確保支持LAMBDA、LET、XLOOKUP、FILTER等動(dòng)態(tài)數(shù)組函數(shù)。WPS: 需要 WPS 365 或最新版本的 WPS Office其對(duì)動(dòng)態(tài)數(shù)組函數(shù)的支持正在不斷完善請(qǐng)確認(rèn)你的版本包含LAMBDA和XLOOKUP。關(guān)鍵功能驗(yàn)證在一個(gè)空白單元格中輸入LAMBDA(x, x)(1)如果返回1則說(shuō)明LAMBDA功能可用。2.2 函數(shù)目標(biāo)設(shè)計(jì)我們的“超級(jí) XLOOKUP”我們旨在創(chuàng)建一個(gè)名為MY_XLOOKUP的自定義函數(shù)它應(yīng)具備以下能力多條件查找支持基于多個(gè)列的組合條件進(jìn)行匹配。返回多列可以一次性返回匹配行對(duì)應(yīng)的多個(gè)列的值。返回多行當(dāng)有多個(gè)匹配項(xiàng)時(shí)能返回一個(gè)垂直數(shù)組多行結(jié)果。錯(cuò)誤處理當(dāng)未找到匹配項(xiàng)時(shí)能返回友好的提示或空數(shù)組。參數(shù)清晰接口設(shè)計(jì)直觀易于使用。函數(shù)原型設(shè)想MY_XLOOKUP(lookup_value1, lookup_array1, [lookup_value2, lookup_array2, ...], return_array, [if_not_found])lookup_value1: 第一個(gè)要查找的值。lookup_array1: 第一個(gè)查找值所在的列區(qū)域。lookup_value2,lookup_array2(可選): 第二組及更多的查找條件和區(qū)域。return_array: 需要返回的結(jié)果區(qū)域可以包含多列。if_not_found(可選): 未找到時(shí)的返回值默認(rèn)為#N/A或空文本。2.3 技術(shù)路線遞歸遍歷與結(jié)果收集我們將采用遞歸來(lái)模擬遍歷查找區(qū)域 (lookup_array) 的每一行終止條件如果查找區(qū)域?yàn)榭找驯闅v完則返回“未找到”的提示或空數(shù)組。匹配判斷取出查找區(qū)域當(dāng)前第一行的值與提供的lookup_value進(jìn)行比較。如果是多條件則需同時(shí)匹配。結(jié)果收集如果匹配成功則取出return_array對(duì)應(yīng)行的值可能是一行多列并將其與“剩余部分遞歸查找的結(jié)果”上下堆疊 (VSTACK)。遞歸推進(jìn)無(wú)論是否匹配都遞歸調(diào)用自身處理查找區(qū)域和返回區(qū)域從第二行開(kāi)始往后的部分。3. 逐步實(shí)現(xiàn) MY_XLOOKUP 函數(shù)我們將分步驟構(gòu)建這個(gè)函數(shù)并在每一步進(jìn)行驗(yàn)證。3.1 第一步定義基礎(chǔ)遞歸骨架首先我們處理最簡(jiǎn)單的情況單條件查找返回單列。打開(kāi) Excel/WPS進(jìn)入“公式”選項(xiàng)卡點(diǎn)擊“名稱管理器”。點(diǎn)擊“新建”輸入名稱MY_XLOOKUP_BASIC。在“引用位置”輸入以下LAMBDA公式LAMBDA(lookup_val, lookup_arr, return_arr, [not_found], LET( lv, lookup_val, la, lookup_arr, ra, return_arr, nf, IF(ISOMITTED(not_found), NA(), not_found), // 終止條件如果查找區(qū)域?yàn)榭辗祷亍拔凑业健敝?IF(ROWS(la)0, nf, LET( current_la_val, INDEX(la, 1, 1), // 取查找區(qū)域第一行 current_ra_val, INDEX(ra, 1, 1), // 取返回區(qū)域第一行 rest_la, IF(ROWS(la)1, INDEX(la, SEQUENCE(ROWS(la)-1, 1, 2, 1)), NA()), // 剩余查找區(qū)域 rest_ra, IF(ROWS(ra)1, INDEX(ra, SEQUENCE(ROWS(ra)-1, 1, 2, 1)), NA()), // 剩余返回區(qū)域 // 判斷是否匹配 IF(current_la_val lv, // 匹配返回當(dāng)前結(jié)果并與剩余部分的遞歸結(jié)果垂直拼接 VSTACK( current_ra_val, MY_XLOOKUP_BASIC(lv, rest_la, rest_ra, nf) ), // 不匹配直接遞歸處理剩余部分 MY_XLOOKUP_BASIC(lv, rest_la, rest_ra, nf) ) ) ) ) )關(guān)鍵點(diǎn)解釋LET函數(shù)用于定義局部變量讓公式更易讀。ISOMITTED(not_found)判斷可選參數(shù)是否被提供。INDEX(array, 1, 1)獲取數(shù)組第一行第一列的值。SEQUENCE(ROWS(la)-1, 1, 2, 1)生成一個(gè)從2開(kāi)始到末尾的序列用于獲取“剩余部分”。VSTACK用于將當(dāng)前行結(jié)果和后續(xù)遞歸結(jié)果垂直堆疊。函數(shù)在公式中遞歸調(diào)用了自身MY_XLOOKUP_BASIC。點(diǎn)擊“確定”保存。測(cè)試 準(zhǔn)備測(cè)試數(shù)據(jù) A列查找列: 蘋果, 香蕉, 蘋果, 橙子 B列返回列: 10, 20, 30, 40 在單元格 D1 輸入MY_XLOOKUP_BASIC(“蘋果”, A1:A4, B1:B4, “未找到”)。預(yù)期結(jié)果應(yīng)該是一個(gè)垂直數(shù)組{10; 30}。3.2 第二步升級(jí)為多條件查找單條件工作后我們?cè)黾佣鄺l件支持。思路是將多個(gè)條件視為一個(gè)組合條件數(shù)組在遞歸判斷時(shí)檢查當(dāng)前行的多個(gè)查找值是否全部等于對(duì)應(yīng)的查找值。新建一個(gè)名稱MY_XLOOKUP_MULTI。引用位置使用以下公式LAMBDA(lookup_vals, lookup_arrs, return_arr, [not_found], LET( lvs, lookup_vals, // 可能是一個(gè)值或水平數(shù)組 las, lookup_arrs, // 可能是一列或多列區(qū)域 ra, return_arr, nf, IF(ISOMITTED(not_found), NA(), not_found), // 確保 lookup_vals 和 lookup_arrs 的第一維行數(shù)概念上對(duì)齊 cond_count, COLUMNS(lvs), IF(ROWS(INDEX(las, , 1))0, nf, // 以第一個(gè)查找區(qū)域的行數(shù)為準(zhǔn)判斷是否為空 LET( // 提取各查找區(qū)域當(dāng)前第一行的值組成一個(gè)數(shù)組 current_la_vals, MAKEARRAY(1, cond_count, LAMBDA(r, c, INDEX(INDEX(las, , c), 1, 1))), current_ra_val, INDEX(ra, 1, ), // 取返回區(qū)域第一行可能多列 // 獲取剩余區(qū)域 rest_las, MAKEARRAY(ROWS(las)-1, cond_count, LAMBDA(r, c, INDEX(INDEX(las, , c), r1, 1))), rest_ra, IF(ROWS(ra)1, INDEX(ra, SEQUENCE(ROWS(ra)-1, 1, 2, 1), ), NA()), // 多條件匹配判斷當(dāng)前行所有查找值是否都等于目標(biāo)值 is_match, AND(current_la_vals lvs), IF(is_match, VSTACK( current_ra_val, MY_XLOOKUP_MULTI(lvs, rest_las, rest_ra, nf) ), MY_XLOOKUP_MULTI(lvs, rest_las, rest_ra, nf) ) ) ) ) )關(guān)鍵點(diǎn)解釋lookup_vals現(xiàn)在可以是一個(gè)單值或水平數(shù)組如{張三,A部門}。lookup_arrs是對(duì)應(yīng)的多列區(qū)域如A1:B100。MAKEARRAY用于構(gòu)建數(shù)組。current_la_vals lvs會(huì)產(chǎn)生一個(gè)布爾數(shù)組AND()將其縮減為單個(gè) TRUE/FALSE。INDEX(ra, 1, )中的逗號(hào)表示獲取第一行的所有列。測(cè)試 數(shù)據(jù) A列姓名: 張三, 李四, 張三, 王五 B列部門: 銷售, 技術(shù), 技術(shù), 銷售 C列工資: 5000, 6000, 5500, 4800 查找“張三”在“技術(shù)”部的工資。在單元格 E1 輸入MY_XLOOKUP_MULTI({張三,技術(shù)}, A1:B4, C1:C4, “無(wú)”)。預(yù)期結(jié)果5500。3.3 第三步完善與優(yōu)化處理返回多列和邊緣情況第二步的函數(shù)已經(jīng)能工作但在處理返回多列和空區(qū)域時(shí)可能不夠健壯。我們進(jìn)行最終優(yōu)化創(chuàng)建MY_XLOOKUP。新建名稱MY_XLOOKUP。使用以下更健壯的公式LAMBDA(lookup_vals, lookup_arrs, return_arr, [if_not_found], LET( lv, IF(COLUMNS(lookup_vals)1, lookup_vals, TRANSPOSE(lookup_vals)), // 統(tǒng)一為列向量 la, lookup_arrs, ra, return_arr, nf, IF(ISOMITTED(if_not_found), NA(), if_not_found), lv_rows, ROWS(lv), la_rows, ROWS(la), ra_rows, ROWS(ra), // 錯(cuò)誤檢查查找區(qū)域和返回區(qū)域行數(shù)應(yīng)一致查找值數(shù)量應(yīng)與查找區(qū)域列數(shù)一致 IF(OR(la_rows ra_rows, lv_rows COLUMNS(la)), “參數(shù)錯(cuò)誤區(qū)域行數(shù)或查找條件數(shù)量不匹配”, // 遞歸核心函數(shù) LET( core, LAMBDA(self, lv_vec, la_sub, ra_sub, IF(ROWS(la_sub)0, nf, // 終止條件返回未找到值可能是NA或自定義值 LET( current_la_row, INDEX(la_sub, 1, ), // 當(dāng)前查找行 current_ra_row, INDEX(ra_sub, 1, ), // 當(dāng)前返回行 rest_la, IF(ROWS(la_sub)1, INDEX(la_sub, SEQUENCE(ROWS(la_sub)-1, , 2), ), NA()), rest_ra, IF(ROWS(ra_sub)1, INDEX(ra_sub, SEQUENCE(ROWS(ra_sub)-1, , 2), ), NA()), is_match, AND(current_la_row TRANSPOSE(lv_vec)), // 行與列向量比較 IF(is_match, LET( rec_result, self(self, lv_vec, rest_la, rest_ra), IF(ROWS(ra_sub)1, current_ra_row, // 如果是最后一行直接返回 VSTACK(current_ra_row, rec_result) ) ), self(self, lv_vec, rest_la, rest_ra) // 不匹配繼續(xù)遞歸 ) ) ) ), // 啟動(dòng)遞歸 core(core, lv, la, ra) ) ) ) )關(guān)鍵點(diǎn)解釋增加了參數(shù)基礎(chǔ)校驗(yàn)確保數(shù)據(jù)維度對(duì)齊。使用了一個(gè)常見(jiàn)的遞歸模式定義了一個(gè)內(nèi)部core函數(shù)它接受自身 (self) 作為參數(shù)以實(shí)現(xiàn)遞歸。這種寫法有時(shí)更清晰。TRANSPOSE用于調(diào)整向量方向以確保比較 () 能正確進(jìn)行。更穩(wěn)健地處理了單行數(shù)據(jù)的情況避免VSTACK錯(cuò)誤。4. 運(yùn)行驗(yàn)證與高級(jí)用例現(xiàn)在讓我們用更復(fù)雜的場(chǎng)景測(cè)試最終版的MY_XLOOKUP。4.1 測(cè)試數(shù)據(jù)準(zhǔn)備創(chuàng)建一個(gè)簡(jiǎn)單的員工信息表員工ID (A)姓名 (B)部門 (C)職位 (D)入職年份 (E)101張三技術(shù)部工程師2020102李四市場(chǎng)部經(jīng)理2019103王五技術(shù)部高級(jí)工程師2021104張三市場(chǎng)部專員2022105趙六技術(shù)部工程師20204.2 用例一單條件查找返回單列查找所有“技術(shù)部”員工的姓名。 在 G1 單元格輸入MY_XLOOKUP(“技術(shù)部”, C2:C6, B2:B6, “無(wú)”)預(yù)期結(jié)果一個(gè)垂直數(shù)組包含{“張三”; “王五”; “趙六”}。4.3 用例二多條件查找返回單列查找“技術(shù)部”且“入職年份”為 2020 的員工姓名。 在 G2 單元格輸入MY_XLOOKUP({“技術(shù)部”, 2020}, C2:C6E2:E6, B2:B6, “無(wú)”)注意這里我們使用了連接符將兩個(gè)條件列臨時(shí)合并為一個(gè)虛擬列。更通用的做法是MY_XLOOKUP接受多列區(qū)域。我們的函數(shù)設(shè)計(jì)是支持多列區(qū)域的所以應(yīng)該用CHOOSE或直接引用多列MY_XLOOKUP({“技術(shù)部”, 2020}, CHOOSE({1,2}, C2:C6, E2:E6), B2:B6, “無(wú)”)預(yù)期結(jié)果{“張三”; “趙六”}。4.4 用例三單條件查找返回多列查找所有“張三”的“部門”和“職位”。 在 G3 單元格輸入MY_XLOOKUP(“張三”, B2:B6, C2:D6, “無(wú)”)預(yù)期結(jié)果一個(gè)兩列的數(shù)組{“技術(shù)部”, “工程師”; “市場(chǎng)部”, “專員”}。4.5 用例四多條件查找返回多列查找“技術(shù)部”的“工程師”的“姓名”和“入職年份”。 在 G4 單元格輸入MY_XLOOKUP({“技術(shù)部”, “工程師”}, C2:C6D2:D6, CHOOSE({1,2}, B2:B6, E2:E6), “無(wú)”)同樣更清晰的寫法是使用多列查找區(qū)域MY_XLOOKUP({“技術(shù)部”, “工程師”}, CHOOSE({1,2}, C2:C6, D2:D6), CHOOSE({1,2}, B2:B6, E2:E6), “無(wú)”)預(yù)期結(jié)果{“張三”, 2020; “趙六”, 2020}。5. 常見(jiàn)問(wèn)題排查與性能考量自定義遞歸函數(shù)雖然強(qiáng)大但在使用中可能會(huì)遇到一些問(wèn)題。5.1 常見(jiàn)錯(cuò)誤與排查問(wèn)題現(xiàn)象可能原因檢查與解決#NAME?錯(cuò)誤1.LAMBDA函數(shù)未定義或名稱拼寫錯(cuò)誤。2. 使用的函數(shù)如VSTACK,LET在你的 Excel/WPS 版本中不可用。1. 檢查“名稱管理器”中是否存在MY_XLOOKUP且引用正確。2. 在空白單元格輸入VSTACK(1,2)和LET(x,1,x)測(cè)試函數(shù)支持性。#VALUE!錯(cuò)誤1. 遞歸深度超出限制Excel 默認(rèn)遞歸限制可能較低。2. 數(shù)組維度不匹配例如VSTACK拼接的數(shù)組列數(shù)不一致。3.AND函數(shù)用于數(shù)組比較時(shí)邏輯錯(cuò)誤。1. 減少數(shù)據(jù)量測(cè)試。遞歸不適合超大數(shù)據(jù)集1000行。2. 檢查return_array的列數(shù)是否固定。確保所有匹配行返回的列數(shù)相同。3. 使用AND(current_la_row TRANSPOSE(lv_vec))確保比較正確??煞纸鉁y(cè)試current_la_row TRANSPOSE(lv_vec)看是否返回布爾數(shù)組。結(jié)果只有第一個(gè)匹配項(xiàng)遞歸邏輯中匹配后可能錯(cuò)誤地終止了遞歸沒(méi)有繼續(xù)處理剩余行。檢查遞歸函數(shù)的IF(is_match, ...)分支確保無(wú)論是否匹配都會(huì)繼續(xù)調(diào)用自身處理剩余區(qū)域 (rest_la,rest_ra)。返回#N/A或自定義的未找到值未找到任何匹配項(xiàng)。這是正常行為。確認(rèn)查找條件是否正確數(shù)據(jù)中是否存在匹配項(xiàng)??梢酝ㄟ^(guò)調(diào)整[if_not_found]參數(shù)返回更友好的提示如“未找到”。公式計(jì)算緩慢或卡死1. 數(shù)據(jù)量過(guò)大。2. 遞歸邏輯存在缺陷導(dǎo)致無(wú)限循環(huán)或極高復(fù)雜度。1. 對(duì)于大數(shù)據(jù)集優(yōu)先考慮使用內(nèi)置的FILTER函數(shù)FILTER(return_array, (lookup_array1lookup_val1)*(lookup_array2lookup_val2))。2. 確保遞歸終止條件 (ROWS(la_sub)0) 一定能被觸發(fā)。5.2 遞歸深度與性能建議Excel 的LAMBDA遞歸有計(jì)算深度限制并且每次遞歸調(diào)用都會(huì)產(chǎn)生計(jì)算開(kāi)銷。因此數(shù)據(jù)規(guī)模此自定義遞歸函數(shù)適用于中小型數(shù)據(jù)集例如幾百行。對(duì)于成千上萬(wàn)行的數(shù)據(jù)性能會(huì)顯著下降。首選內(nèi)置函數(shù)如果 Office 365/WPS 支持FILTER函數(shù)強(qiáng)烈建議直接使用FILTER進(jìn)行多條件查找。它的語(yǔ)法更簡(jiǎn)潔且由底層引擎優(yōu)化速度極快。多條件單列返回FILTER(返回列, (條件列1條件1) * (條件列2條件2))多條件多列返回FILTER(返回區(qū)域, (條件列1條件1) * (條件列2條件2))本函數(shù)的價(jià)值主要在于學(xué)習(xí)和理解LAMBDA遞歸的編程思想以及在某些特定復(fù)雜邏輯內(nèi)置函數(shù)無(wú)法直接表達(dá)下提供一個(gè)高度可定制的解決方案模板。6. 最佳實(shí)踐與擴(kuò)展方向6.1 使用與維護(hù)最佳實(shí)踐命名規(guī)范在名稱管理器中為自定義LAMBDA函數(shù)使用清晰、前綴統(tǒng)一的名字如FN_或UTIL_開(kāi)頭方便管理。添加注釋在LAMBDA公式中利用LET函數(shù)和//在公式欄換行添加注釋說(shuō)明參數(shù)含義和關(guān)鍵步驟。參數(shù)驗(yàn)證如最終版函數(shù)所示在函數(shù)開(kāi)頭對(duì)輸入?yún)?shù)的維度、類型進(jìn)行基礎(chǔ)校驗(yàn)返回明確的錯(cuò)誤信息便于調(diào)用者調(diào)試。備份與文檔將重要的自定義函數(shù)名稱和其“引用位置”的公式記錄在文檔或單獨(dú)的“函數(shù)庫(kù)”工作表中防止工作簿損壞導(dǎo)致丟失。測(cè)試驅(qū)動(dòng)在正式使用前用小型、典型的測(cè)試數(shù)據(jù)集驗(yàn)證函數(shù)的所有邊界情況空查找、單匹配、多匹配、無(wú)匹配、錯(cuò)誤輸入等。6.2 功能擴(kuò)展思路當(dāng)前的MY_XLOOKUP實(shí)現(xiàn)了核心查找功能你可以在此基礎(chǔ)上擴(kuò)展匹配模式引入第5個(gè)參數(shù)[match_mode]模仿XLOOKUP實(shí)現(xiàn)精確匹配、通配符匹配、二分查找需排序數(shù)據(jù)等。這需要在遞歸判斷條件is_match處修改邏輯。搜索模式引入第6個(gè)參數(shù)[search_mode]實(shí)現(xiàn)從下往上搜索最后匹配項(xiàng)。這需要調(diào)整遞歸遍歷的順序可以從最后一行開(kāi)始或者改變索引提取的邏輯。返回第N個(gè)匹配項(xiàng)增加一個(gè)參數(shù)指定返回第幾個(gè)匹配到的結(jié)果而不是所有結(jié)果。這需要在遞歸中增加一個(gè)計(jì)數(shù)器。近似匹配與區(qū)間查找適用于數(shù)值區(qū)間查找如根據(jù)分?jǐn)?shù)找等級(jí)。這需要將等號(hào)判斷 () 替換為區(qū)間判斷如AND(score lower, score upper)。6.3 何時(shí)選擇內(nèi)置函數(shù)何時(shí)選擇自定義 LAMBDA場(chǎng)景推薦方案理由簡(jiǎn)單的單/多條件查找返回單列/多列內(nèi)置FILTER函數(shù)語(yǔ)法簡(jiǎn)單性能最優(yōu)維護(hù)成本最低。需要精確模仿XLOOKUP的搜索模式、匹配模式內(nèi)置XLOOKUP函數(shù)功能全面原生支持。查找邏輯極其復(fù)雜內(nèi)置函數(shù)組合公式冗長(zhǎng)難懂自定義LAMBDA函數(shù)封裝復(fù)雜邏輯提高公式可讀性和可復(fù)用性。需要實(shí)現(xiàn)內(nèi)置函數(shù)沒(méi)有的特定算法如遞歸遍歷樹(shù)形結(jié)構(gòu)自定義LAMBDA遞歸函數(shù)提供最大的靈活性。數(shù)據(jù)處理流程中需要一個(gè)可命名的、清晰的“步驟”自定義LAMBDA函數(shù)作為L(zhǎng)ET函數(shù)中的一部分讓計(jì)算過(guò)程更模塊化。通過(guò)本次“手搓”XLOOKUP的實(shí)踐你不僅學(xué)會(huì)了一個(gè)強(qiáng)大的自定義查找工具更重要的是掌握了LAMBDA遞歸這一在 Excel/WPS 中進(jìn)行函數(shù)式編程的核心方法。在面對(duì)獨(dú)特的數(shù)據(jù)處理需求時(shí)這能讓你擺脫對(duì)固定套路的依賴真正按照自己的思路去構(gòu)建計(jì)算模型。下次當(dāng)內(nèi)置函數(shù)捉襟見(jiàn)肘時(shí)不妨考慮一下是否可以用LAMBDA遞歸來(lái)創(chuàng)造你自己的解決方案。