據(jù)清洗實(shí)戰(zhàn):從MID函數(shù)到數(shù)組公式的完整指南)
看到這個(gè)標(biāo)題我想起上周幫一個(gè)做運(yùn)營(yíng)的朋友處理會(huì)員信息表幾百行“城市-區(qū)域-門(mén)店”混合文本她一個(gè)個(gè)復(fù)制粘貼搞了兩個(gè)鐘頭我用MID套FIND三分鐘弄完。她當(dāng)時(shí)那個(gè)表情我到現(xiàn)在都記得。這也是我想寫(xiě)這篇指南的原因——MID函數(shù)在Excel里不算冷門(mén)但絕大多數(shù)人只停留在“能從中間取幾個(gè)字”的層面根本沒(méi)有意識(shí)到它在文本清洗、數(shù)據(jù)拆分、動(dòng)態(tài)提取這些場(chǎng)景里有多能打。這篇東西不打算寫(xiě)成說(shuō)明書(shū)式的參數(shù)羅列我盡量按照實(shí)際干活時(shí)“遇到什么問(wèn)題→為什么用MID→怎么用才能不出錯(cuò)”的順序來(lái)寫(xiě)爭(zhēng)取讓你看完就能直接用到自己的表格里。1. 先搞清MID函數(shù)的本質(zhì)字符串切片工具而不是簡(jiǎn)單的“取中間”很多人學(xué)MID函數(shù)是被它的名字誤導(dǎo)的以為它就是“從中間截取”然后遇到需求就開(kāi)始套。實(shí)際上你如果用工程思維去看MID的本質(zhì)是字符串切片Substring它做的事情是給定一個(gè)文本從你指定的起點(diǎn)開(kāi)始往右數(shù)指定的字符數(shù)把這一段切出來(lái)。它不關(guān)心你的文本有沒(méi)有規(guī)律OPPOSITE也不關(guān)心你取出來(lái)的東西有沒(méi)有含義它只認(rèn)三個(gè)數(shù)字——從哪開(kāi)始、取多長(zhǎng)。這個(gè)底層認(rèn)知很重要因?yàn)樗鼪Q定了你后續(xù)所有的使用方式。舉個(gè)例子你要從一串編碼“AF-20240313-037”里面把日期部分“20240313”取出來(lái)。你不會(huì)說(shuō)“我要取中間那段”你會(huì)說(shuō)“我要從第4個(gè)字符開(kāi)始取8個(gè)字符”。這兩個(gè)說(shuō)法在Excel公式里的表達(dá)完全不一樣前者會(huì)讓你不自覺(jué)地去數(shù)位置后者讓你直接把位置作為變量處理。而MID真正厲害的地方就在這它的兩個(gè)核心參數(shù)start_num和num_chars都可以不是寫(xiě)死的數(shù)字而是由別的函數(shù)計(jì)算出來(lái)的數(shù)字。我在實(shí)際工作中經(jīng)常把MID當(dāng)成“管道工”來(lái)用先用FIND或SEARCH定位分隔符的位置把定位結(jié)果喂給MID當(dāng)起始點(diǎn)再通過(guò)LEN或者其他方式的長(zhǎng)度計(jì)算告訴MID切多長(zhǎng)。這樣一來(lái)不管你的原始文本是3個(gè)字符還是30個(gè)字符不管下次導(dǎo)入的數(shù)據(jù)又多了幾列公式都不用改。這才是MID能批量處理、能扛住數(shù)據(jù)變動(dòng)的底氣。另外還要澄清一個(gè)概念MID是按“字符”切不是按“字節(jié)”切。這個(gè)區(qū)別在處理中文時(shí)特別重要。在Excel里一個(gè)漢字占一個(gè)字符跟在這個(gè)函數(shù)里它的字節(jié)數(shù)是多少無(wú)關(guān)所以“我愛(ài)你”三個(gè)字MID(A1,2,1)返回的是“愛(ài)”不會(huì)出現(xiàn)半個(gè)漢字的情況。這點(diǎn)對(duì)國(guó)內(nèi)用戶(hù)來(lái)說(shuō)是福音你不用像在某些編程語(yǔ)言里那樣去考慮中文雙字節(jié)的問(wèn)題。關(guān)于參數(shù)還有一個(gè)特別容易被人忽略的細(xì)節(jié)就是MID在start_num小于等于0時(shí)的表現(xiàn)。很多初學(xué)者以為給它一個(gè)大一點(diǎn)的數(shù)或者負(fù)數(shù)會(huì)報(bào)錯(cuò)實(shí)際上Excel的容錯(cuò)處理是如果start_num為0結(jié)果返回空文本如果為負(fù)數(shù)直接返回#VALUE!錯(cuò)誤。這個(gè)特性在一些邊界場(chǎng)景中反而能用來(lái)做防御性設(shè)計(jì)后面我會(huì)專(zhuān)門(mén)講這里先埋個(gè)伏筆。2. MID、LEFT、RIGHT三兄弟為什么文本處理優(yōu)先選MID而不是另外兩個(gè)你隨便打開(kāi)一個(gè)Excel教程講文本提取基本都是MID、LEFT、RIGHT一起出場(chǎng)。這三個(gè)函數(shù)本質(zhì)上都是切片工具區(qū)別只有起始位置不同LEFT從第一個(gè)字符開(kāi)始往右切RIGHT從最后一個(gè)字符往左切MID從任意指定位置開(kāi)始切。功能上LEFT和RIGHT完全可以看成MID的特殊情況——LEFT就是從第1位開(kāi)始、長(zhǎng)度自定的MIDRIGHT則是起點(diǎn)和長(zhǎng)度做了一點(diǎn)數(shù)學(xué)換算的MID。那我為什么強(qiáng)調(diào)優(yōu)先學(xué)透MID因?yàn)檎鎸?shí)數(shù)據(jù)里“從固定位置開(kāi)始取N位”的場(chǎng)景遠(yuǎn)多于“從開(kāi)頭取”或“從結(jié)尾取”的場(chǎng)景。比如說(shuō)訂單號(hào)可能是“CUST20240517ABC001”你想提取中間那段日期或者從身份證號(hào)里提取出生日期——這些都是典型的MID活LEFT和RIGHT根本幫不上忙。即使你面對(duì)的是看起來(lái)能從右邊取值的情況比如從文件路徑“D:\data\2024\report.xlsx”里取文件名“report.xlsx”初看能用RIGHT但你仔細(xì)一想路徑長(zhǎng)度會(huì)變你根本不知道該倒著數(shù)多少位。反過(guò)來(lái)用MID配合FIND定位最后一個(gè)反斜杠的位置就穩(wěn)得多。三者的另一個(gè)區(qū)別體現(xiàn)在對(duì)變長(zhǎng)文本的適配性。LEFT和RIGHT的常見(jiàn)用法是配合LEN函數(shù)一起用RIGHT(A1, LEN(A1)-3)表示“去掉前3個(gè)字符后剩下的部分”這是一種變通的“從第4位開(kāi)始取到結(jié)尾”的寫(xiě)法。但這寫(xiě)法有兩個(gè)問(wèn)題一是公式表達(dá)不夠直觀(guān)別人看代碼時(shí)要反應(yīng)一下才知道意圖二是當(dāng)你要截取的區(qū)間同時(shí)受左右兩側(cè)條件約束時(shí)LEFT或RIGHT怎么組合都別扭只有MID能自由地同時(shí)控制起點(diǎn)和長(zhǎng)度。我用一個(gè)平時(shí)很常見(jiàn)的需求來(lái)對(duì)比一下。假設(shè)一列數(shù)據(jù)是“姓名-部門(mén)-工號(hào)”你要把中間的部門(mén)取出來(lái)。用LEFT或RIGHT都得先做一次FIND定位再用減法繞一圈而用MID直接定位第一個(gè)分隔符加1作為起點(diǎn)再用兩個(gè)分隔符的位置差減1作為長(zhǎng)度一步到位。公式一眼就能看懂MID(A1, FIND(-,A1)1, FIND(-,A1,FIND(-,A1)1)-FIND(-,A1)-1)。這串公式看起來(lái)長(zhǎng)實(shí)際上結(jié)構(gòu)非常清晰就是在回答三個(gè)問(wèn)題從哪開(kāi)始在第幾個(gè)字符結(jié)束長(zhǎng)度是多少這種“提問(wèn)式”的寫(xiě)法才是處理復(fù)雜文本時(shí)不容易出錯(cuò)的關(guān)鍵。所以我的建議是把MID當(dāng)成默認(rèn)工具LEFT和RIGHT作為快捷方式。只有當(dāng)你需求明確到“從左側(cè)固定位置取固定長(zhǎng)度”或“從右側(cè)取固定長(zhǎng)度”時(shí)才考慮用后兩者。這個(gè)習(xí)慣能幫你減少很多繞來(lái)繞去的長(zhǎng)度計(jì)算也讓公式可讀性更好。3. 定位的藝術(shù)MID配合FIND函數(shù)破解無(wú)規(guī)律文本MID函數(shù)真正的威力是在它跟定位函數(shù)配合使用之后才發(fā)揮出來(lái)的。單獨(dú)用MID你需要手工數(shù)清楚“從第幾個(gè)字符開(kāi)始取”一旦原始文本含中文、空格、字母混排數(shù)錯(cuò)一位就是事故。而FIND函數(shù)可以幫你在文本中定位某個(gè)字符或字符串第一次出現(xiàn)的位置把它的結(jié)果直接傳給MID的start_num參數(shù)這樣公式就具備了自適應(yīng)能力。3.1 基礎(chǔ)組合按分隔符提取任意字段先看一個(gè)最常見(jiàn)的場(chǎng)景。有一列原始數(shù)據(jù)是混合文本“華東大區(qū)-上海-浦東店-店長(zhǎng)-張偉”你只想提取“上海”這部分。用FIND定位第一個(gè)“-”的位置假設(shè)結(jié)果是5那么起點(diǎn)就是516。再用FIND定位第二個(gè)“-”的位置假設(shè)是8那么長(zhǎng)度就是8-5-12。公式就是MID(A1, FIND(-,A1)1, FIND(-,A1,FIND(-,A1)1)-FIND(-,A1)-1)。這里有個(gè)細(xì)節(jié)值得注意第二個(gè)FIND的第三個(gè)參數(shù)是FIND(-,A1)1它表示從第一個(gè)分隔符后面那個(gè)字符開(kāi)始繼續(xù)找。如果不寫(xiě)這個(gè)參數(shù)FIND永遠(yuǎn)返回第一個(gè)“-”的位置那長(zhǎng)度就成負(fù)數(shù)了公式直接報(bào)錯(cuò)。這種嵌套FIND定位的寫(xiě)法本質(zhì)上是把“兩個(gè)分隔符之間是什么”這個(gè)邏輯翻譯成了Excel能計(jì)算的算術(shù)題。只要你的數(shù)據(jù)有統(tǒng)一的分隔符哪怕是“商品編號(hào)A1001”這種帶冒號(hào)的或者“2024年5月17日”這種帶“年”“月”的都可以用同樣的套路提取。關(guān)鍵判斷是你能不能找到用來(lái)定位的兩條邊界線(xiàn)。能MID就一定能提出來(lái)。實(shí)際工作時(shí)我經(jīng)常把這段公式定義成“一次性用品”——也就是先寫(xiě)出來(lái)驗(yàn)證結(jié)果是對(duì)的后續(xù)再根據(jù)需求做擴(kuò)展。因?yàn)檫@種嵌套FIND的公式比較長(zhǎng)手寫(xiě)容易漏括號(hào)Excel的自動(dòng)補(bǔ)全括號(hào)功能在這時(shí)候特別有用。我的習(xí)慣是把每個(gè)FIND單獨(dú)寫(xiě)在一列確認(rèn)返回的位置數(shù)值正確后再逐步合并成一條總公式。這樣既方便排查錯(cuò)誤也方便教別人看懂邏輯。3.2 處理多級(jí)嵌套結(jié)構(gòu)不斷縮小查找范圍如果文本結(jié)構(gòu)更復(fù)雜一些比如“2024/華東大區(qū)/上海/浦東店/店長(zhǎng)/張偉”字段之間用斜杠分隔而且中間的字段個(gè)數(shù)還不固定——有的行有5段有的行有7段。這時(shí)候想提取“店長(zhǎng)”這個(gè)崗位字段直接笨辦法是從左邊找第三個(gè)斜杠再到第四個(gè)斜杠但如果字段數(shù)不固定這種辦法就不成立。比較實(shí)用的思路是反向定位先找到最后一個(gè)斜杠也就是姓名前面的那個(gè)分隔符然后從它的位置再往前找前一個(gè)斜杠。Excel里沒(méi)有直接的“RFind”函數(shù)但可以用SUBSTITUTE把最后一個(gè)斜杠替換成一個(gè)特殊占位符再用FIND定位這個(gè)占位符的位置。我一個(gè)實(shí)際例子說(shuō)明。數(shù)據(jù)是“2024/華東大區(qū)/上海/浦東店/店長(zhǎng)/張偉”要把“店長(zhǎng)”提取出來(lái)。核心思路分三步第一步用SUBSTITUTE把“/”全部替換成N個(gè)然后數(shù)一下總共有幾個(gè)斜杠這需要配合LEN函數(shù)來(lái)數(shù)第二步再用SUBSTITUTE把最后一個(gè)斜杠替換成一個(gè)文本中絕對(duì)不會(huì)出現(xiàn)的字符比如“”第三步用FIND定位“”的位置這就等于定位到了最后一個(gè)斜杠的位置。上面的位置找到了再往前的斜杠位置只需要“最后一個(gè)斜杠位置-1”后再往前找一次即可。提取中間段落的邏輯跟3.1一樣MID的起點(diǎn)設(shè)為“倒數(shù)第二個(gè)斜杠1”長(zhǎng)度設(shè)為“最后一個(gè)斜杠位置-倒數(shù)第二個(gè)斜杠位置-1”。這套操作看起來(lái)繞但本質(zhì)上是把“在變長(zhǎng)文本中定位特定段落”的難題轉(zhuǎn)換成“用標(biāo)記字符制造錨點(diǎn)”的工程思維。在實(shí)際工作中尤其是做數(shù)據(jù)治理、清洗歷史表格時(shí)這種“先制造錨點(diǎn)再定位”的思路非常實(shí)用很多看似無(wú)解的自由文本抽取問(wèn)題都能用它解掉。3.3 反向定位與MID函數(shù)配合從右側(cè)提取指定信息還有一個(gè)經(jīng)常被忽略的場(chǎng)景是從右側(cè)開(kāi)始提取但RIGHT函數(shù)長(zhǎng)度需要變長(zhǎng)的時(shí)候很難用。比如從“D:\projects\2024\預(yù)算表-final.xlsx”提取文件名“預(yù)算表-final.xlsx”。文件名長(zhǎng)度不固定用RIGHT不知道取幾位。這時(shí)你先用SUBSTITUTE配合LEN算出總字符數(shù)然后反向定位最后一個(gè)“\”的位置。MID的起點(diǎn)就是最后一個(gè)反斜杠位置1長(zhǎng)度直接用“總字符數(shù)-反斜杠位置”即可用LEN(A1)-FIND(爆,SUBSTITUTE(A1,,爆,LEN(A1)-LEN(SUBSTITUTE(A1,,))))這種組合來(lái)算。具體公式寫(xiě)法會(huì)因?yàn)槟阆爰嫒莶煌瑘?chǎng)景而略有差別但核心邏輯是一致的先把動(dòng)態(tài)長(zhǎng)度轉(zhuǎn)化為靜態(tài)數(shù)字再交給MID處理。我一直覺(jué)得RIGHT在變長(zhǎng)場(chǎng)景下被用得太多很多用戶(hù)明明知道文件名“report-v3.0.xlsx”是變長(zhǎng)的還是死磕RIGHT的參數(shù)把公式越寫(xiě)越復(fù)雜。反過(guò)來(lái)用MID配合錨點(diǎn)字符起點(diǎn)通過(guò)FIND/SUBSTITUTE計(jì)算長(zhǎng)度通過(guò)LEN計(jì)算一次到位而且公式對(duì)數(shù)據(jù)變化的適應(yīng)能力更強(qiáng)。真正上線(xiàn)跑數(shù)據(jù)的時(shí)候你才會(huì)發(fā)現(xiàn)這種公式的穩(wěn)定性有多重要。4. 數(shù)據(jù)清洗大殺器用MID處理不規(guī)則的臟數(shù)據(jù)日常用Excel做數(shù)據(jù)分析的人花在數(shù)據(jù)清洗上的時(shí)間往往比做分析本身還多。MID函數(shù)在這一階段的作用絕對(duì)被低估了——它不僅能從規(guī)則文本中取字段還能在完全不規(guī)則的文本里“撈”出你要的信息。下面這幾個(gè)場(chǎng)景是我在真實(shí)項(xiàng)目中反復(fù)用到的。4.1 提取數(shù)字串與中文混合內(nèi)容表格里總有一些“信息殘?jiān)笔降臄?shù)據(jù)比如“應(yīng)收款12345元”“編號(hào)AB-8848待復(fù)核”“電話(huà)13800138000轉(zhuǎn)王經(jīng)理”。你要把里面的數(shù)字部分單獨(dú)提取出來(lái)。如果數(shù)字連續(xù)出現(xiàn)而且有明確的起始位置標(biāo)記MID配合FIND就能處理。比如“編號(hào)AB-8848待復(fù)核”里的8848可以先用MID遍歷檢查每個(gè)字符是否為數(shù)字但這需要數(shù)組公式配合比較復(fù)雜后面會(huì)講。如果數(shù)字在文本中的位置不固定但能確定邊界標(biāo)志比如后面跟的是漢字“元”那MIDFIND的思路是可行的。以“應(yīng)收款12345元”為例你要提取“12345”需要先找到數(shù)字開(kāi)始的位置——也就是第一個(gè)數(shù)字字符的位置這通常要用數(shù)組方式逐個(gè)字符檢查而不是一個(gè)簡(jiǎn)單的函數(shù)。確實(shí)純靠MIDFIND做不到要借助其他輔助函數(shù)。所以真正干凈利落的做法是用MID生成一個(gè)“字符流”配合ROW和INDIRECT生成序列把每個(gè)字符列出來(lái)再用ISNUMBER判斷數(shù)字位最后用文本合并函數(shù)把連續(xù)數(shù)字拼起來(lái)。在Excel 365里這個(gè)公式可能是一長(zhǎng)串?dāng)?shù)組公式也可以先用分列功能將單個(gè)字符分列后再用MID處理。這里分享一個(gè)我常用的快速思路先把文本用“每個(gè)字符一個(gè)單元格”的方式拆分出來(lái)這本身用MID和ROW就可以完成然后直接加一個(gè)輔助列標(biāo)記是否為數(shù)字再用CONCAT或其他函數(shù)拼接連續(xù)數(shù)字。雖然步驟多但邏輯直白讓領(lǐng)導(dǎo)檢查公式時(shí)一眼就能看懂。4.2 拆分“姓名部門(mén)”和“產(chǎn)品-型號(hào)-規(guī)格”等組合字段處理“張三銷(xiāo)售部”“李四技術(shù)部”這類(lèi)組合字段時(shí)常規(guī)做法是FIND定位“”和“”然后MID提取中間內(nèi)容。公式為MID(A1, FIND(,A1)1, FIND(,A1)-FIND(,A1)-1)。這里Excel使用的是全角中文括號(hào)FIND區(qū)分全角和半角不能混用。如果你的數(shù)據(jù)里既有全角又有半角括號(hào)就需要先用SUBSTITUTE統(tǒng)一括號(hào)格式再執(zhí)行MID提取這屬于典型的“清洗前置”思路。我在這類(lèi)需求上有個(gè)習(xí)慣除非數(shù)據(jù)源格式非常規(guī)范否則不主張寫(xiě)一條“一步到位”的長(zhǎng)公式。更好的做法是先把全角半角統(tǒng)一把空格思路留在后面然后分列成“姓名”和“部門(mén)”兩列。因?yàn)檎鎸?shí)數(shù)據(jù)里可能有“張三 (銷(xiāo)售部) ”這種帶空格或帶ASCII括號(hào)的雜數(shù)據(jù)一條公式一旦遇到異常行返回的就是錯(cuò)誤值或者錯(cuò)位文本排查半天還找不到原因。反而是分步驟、加輔助列的做法每一列的公式都短、都直觀(guān)任何時(shí)候有人問(wèn)你“這列數(shù)據(jù)怎么來(lái)的”你都能一句話(huà)講清楚。4.3 從身份證號(hào)、銀行卡號(hào)等定長(zhǎng)編碼中提取信息這類(lèi)屬于MID函數(shù)最典型的應(yīng)用場(chǎng)景我想單獨(dú)拿出來(lái)說(shuō)。身份證號(hào)18位第7到14位是出生日期銀行卡號(hào)雖然長(zhǎng)度因銀行而異但中間某幾位固定含義學(xué)號(hào)、工號(hào)、業(yè)務(wù)訂單號(hào)也經(jīng)常用定長(zhǎng)編碼規(guī)則。處理定長(zhǎng)編碼時(shí)MID就是絕對(duì)的主力MID(A1,7,4)年MID(A1,11,2)月MID(A1,13,2)日”。這是很少的出過(guò)意外的基礎(chǔ)用法。但有個(gè)容易出問(wèn)題的地方一旦源數(shù)據(jù)被Excel以科學(xué)計(jì)數(shù)法或者文本格式改寫(xiě)過(guò)你可能提取到“4.21E17”之類(lèi)的截?cái)嘀?。所以處理這類(lèi)文本時(shí)一定要先確認(rèn)單元格格式是“文本”或者用TEXT函數(shù)把數(shù)值轉(zhuǎn)成字符串再操作。我實(shí)際上處理身份證號(hào)時(shí)都會(huì)先在數(shù)據(jù)導(dǎo)入階段加一列輔助TEXT(A1,)或A1強(qiáng)制它變成文本。很多人在這一步吃了虧等到發(fā)現(xiàn)提取結(jié)果全是“4.21E17”時(shí)才回過(guò)神往往數(shù)據(jù)已經(jīng)污染了一部分。這種坑提前在公式設(shè)計(jì)時(shí)堵住是最好的。定長(zhǎng)編碼還有一個(gè)好處提取規(guī)則明確MID位置參數(shù)完全可以直接寫(xiě)死不需要FIND參與。所以這類(lèi)公式往往是最穩(wěn)、最快、最容易背下來(lái)的。我打賭很多讀者這會(huì)兒已經(jīng)在腦子里寫(xiě)了無(wú)數(shù)遍“MID(A1,7,8)”了沒(méi)錯(cuò)這正是MID函數(shù)最親切的樣子——當(dāng)數(shù)據(jù)結(jié)構(gòu)規(guī)律時(shí)它簡(jiǎn)單得讓人感動(dòng)。5. 數(shù)組思維MID配合ROW一列拆多行的高級(jí)玩法上面講的都是MID處理“一個(gè)格子里的一段文本”的場(chǎng)景。但Excel進(jìn)階用戶(hù)的標(biāo)志之一就是想明白“MID也可以用于數(shù)組生成”把一條文本拆成一行甚至把一個(gè)單元格的內(nèi)容豎著拆成多行。這個(gè)思路在很多統(tǒng)計(jì)場(chǎng)景中特別好用。5.1 提取連續(xù)數(shù)字的通用數(shù)組公式回到之前“從混亂文本里提取所有數(shù)字”的例子。在Excel 365中你可以用MID(A1, ROW(INDIRECT(1:LEN(A1))), 1)生成該文本里每一個(gè)字符的數(shù)組然后再配合ISNUMBER和VALUE等函數(shù)把是數(shù)字的位置取出來(lái)最后再用TEXTJOIN或CONCAT拼起來(lái)。公式大致是TEXTJOIN(,TRUE,IF(ISNUMBER(--MID(A1,ROW(INDIRECT(1:LEN(A1))),1)),MID(A1,ROW(INDIRECT(1:LEN(A1))),1),))數(shù)組公式記得按CtrlShiftEnter除非是365動(dòng)態(tài)數(shù)組。這一長(zhǎng)串公式看起來(lái)嚇人但拆開(kāi)其實(shí)不復(fù)雜ROW(INDIRECT(1:LEN(A1)))的作用是生成一個(gè)從1到文本長(zhǎng)度的數(shù)字序列作為MID的start_num列表然后MID就一個(gè)接一個(gè)地把文本中的每個(gè)字符“摳”出來(lái)形成一個(gè)字符數(shù)組IF層負(fù)責(zé)過(guò)濾只有是數(shù)字才保留不是數(shù)字就換成空TEXTJOIN把這些保留下來(lái)的數(shù)字字符無(wú)縫拼接。這個(gè)公式的價(jià)值在于不用輔助列不依賴(lài)分隔符一條公式就能提取數(shù)字串前提是你的Excel支持TEXTJOIN函數(shù)Office 2019以后或365才行。我在實(shí)際工作中這種寫(xiě)法最大的意義不是“短”而是“邏輯完整”。跟把文本手工分列后再處理相比這條公式把整個(gè)過(guò)程都鎖在了一個(gè)單元格里以后數(shù)據(jù)更新了公式自動(dòng)跟著變不用重新操作一遍。代價(jià)是如果你在舊版Excel或WPS里跑數(shù)組公式的確認(rèn)方式和性能可能會(huì)有點(diǎn)問(wèn)題這里需要自查版本不能閉眼用。5.2 將單元格內(nèi)容按字符拆成縱列或橫排除了提取數(shù)字MID配合ROW還能做“把一個(gè)單元格內(nèi)容拆成一列”。比如要把A1里的“ABC123”拆成A、B、C、1、2、3六個(gè)單元格放成一列可以用MID($A$1,ROW(A1),1)下拉填充也可以直接在Excel 365里用MID(A1,ROW(INDIRECT(1:LEN(A1))),1)動(dòng)態(tài)溢出成一列。這招在處理發(fā)票號(hào)碼拆分、學(xué)號(hào)按位分析、編碼拆解對(duì)比時(shí)非常實(shí)用。這類(lèi)“拆到最小單元”的操作再配合COUNTIF、SUMIF做下一步統(tǒng)計(jì)能解決好多看起來(lái)無(wú)從下手的問(wèn)題。比如學(xué)生選課編碼“A101-B202-C303”你想統(tǒng)計(jì)每門(mén)課出現(xiàn)次數(shù)可以先拆成課程單元列表再用COUNTIF統(tǒng)計(jì)。MID在這里扮演的是數(shù)據(jù)預(yù)處理角色它不負(fù)責(zé)最終結(jié)果但沒(méi)有它后面所有統(tǒng)計(jì)都無(wú)從談起。5.3 MID與SEQUENCE函數(shù)新版本里的數(shù)組革命如果你用的是Excel 365或最新版WPS手里還有SEQUENCE這個(gè)函數(shù)那么MID數(shù)組公式可以寫(xiě)得比ROW(INDIRECT(...))更直觀(guān)。比如MID(A1,SEQUENCE(LEN(A1)),1)直接生成“第1到第LEN(A1)個(gè)字符”的垂直數(shù)組不需要數(shù)組三鍵確認(rèn)。這個(gè)簡(jiǎn)化對(duì)新手特別友好因?yàn)樗选吧尚蛱?hào)”這一層的抽象去掉了公式讀起來(lái)就是“按長(zhǎng)度生成序列然后依次取第N個(gè)字符”。不過(guò)我還是要提醒一句SEQUENCE生成的數(shù)組長(zhǎng)度與單元格內(nèi)容長(zhǎng)度綁定如果A1是空文本LEN返回0SEQUENCE(0)會(huì)返回錯(cuò)誤。所以實(shí)用中通常加一層IFERROR或先判斷LEN是否大于0再執(zhí)行。這種邊界條件的考慮在數(shù)組公式里特別重要——因?yàn)閿?shù)組一旦溢出可能導(dǎo)致整列報(bào)錯(cuò)排查起來(lái)比普通公式費(fèi)勁得多。6. 日常工作中總結(jié)的MID函數(shù)“避坑清單”寫(xiě)了這么多年Excel公式MID函數(shù)相關(guān)的坑我踩過(guò)不少也幫同事排查過(guò)不少。這些問(wèn)題單看都不大但一旦出現(xiàn)在一個(gè)重要報(bào)表里能讓你加班到懷疑人生。我把覺(jué)得最有價(jià)值的幾條列在這里當(dāng)作給讀者的“疫苗”打上之后大概率能少走彎路。6.1 中文與全角字符FIND查找時(shí)最容易翻車(chē)MID本身不區(qū)分全角半角它只是按字符位置切。但FIND函數(shù)定位分隔符時(shí)對(duì)全角、半角字符是敏感的?!啊焙汀?”是兩個(gè)完全不同的字符在MIDFIND組合中如果沒(méi)注意公式返回的要么是錯(cuò)誤值要么是錯(cuò)位文本。處理辦法很簡(jiǎn)單——清洗前置用SUBSTITUTE統(tǒng)一全半角。具體步驟是先判斷你的數(shù)據(jù)源里常用哪種括號(hào)、哪種逗號(hào)、哪種冒號(hào)統(tǒng)一替換成一致格式后再走M(jìn)IDFIND流程。這一步看似多此一舉但能省下后面無(wú)數(shù)排查時(shí)間。另外有些從網(wǎng)頁(yè)或PDF復(fù)制來(lái)的文本里空格不一定是普通空格可能是不間斷空格Char(160)或全角空格Char(12288)。FIND去定位“ ”時(shí)會(huì)找不到返回#VALUE!。遇到這類(lèi)情況我會(huì)先用SUBSTITUTE把這兩種空格統(tǒng)一替換成普通空格再做定位??梢哉f(shuō)凡是“FIND死活找不到”的場(chǎng)景八成是隱藏字符在作怪。6.2 start_num與num_chars的邊界問(wèn)題MID(A1,0,5)返回空文本MID(A1,-1,5)返回#VALUE!MID(A1,2,0)返回空文本MID(A1,2,-1)返回#VALUE!這是三個(gè)參數(shù)取值時(shí)的基本規(guī)則。很多人忽略了“num_chars必須大于等于0”這一點(diǎn)導(dǎo)致公式在某些行上返回錯(cuò)誤。典型場(chǎng)景是你用FIND兩個(gè)分隔符的位置差-1作為長(zhǎng)度當(dāng)兩個(gè)分隔符緊挨著比如“AB||CD”時(shí)位置差-1等于0MID返回空文本這沒(méi)問(wèn)題但如果位置差等于0也就是分隔符位置相同邏輯上不存在長(zhǎng)度就會(huì)變成-1報(bào)錯(cuò)。解決方式通常是MAX(0, 計(jì)算出的長(zhǎng)度)或者IFERROR包裹一層把邊界情況擋在外面。還有一個(gè)老生常談但必須強(qiáng)調(diào)的start_num超過(guò)文本長(zhǎng)度時(shí)MID返回空文本而不報(bào)錯(cuò)。這一點(diǎn)在批量處理時(shí)容易被忽視因?yàn)槟憧床坏饺魏渭t色報(bào)錯(cuò)提示只會(huì)發(fā)現(xiàn)某些行的結(jié)果“憑空消失”了。我自己處理這類(lèi)情況時(shí)習(xí)慣加一個(gè)LEN判斷或者用IF條件把空文本替換成“無(wú)數(shù)據(jù)”之類(lèi)的占位詞防止業(yè)務(wù)方看漏。6.3 嵌套函數(shù)太多導(dǎo)致的計(jì)算性能問(wèn)題MIDFIND經(jīng)常導(dǎo)致一長(zhǎng)串嵌套幾百行數(shù)據(jù)可能還能跑但如果是幾萬(wàn)行的報(bào)表每一個(gè)單元格里都跑一遍長(zhǎng)公式Excel的計(jì)算時(shí)間會(huì)肉眼可見(jiàn)地變長(zhǎng)。這時(shí)候我建議拆輔助列。不是每一列都要一個(gè)公式輸出最終結(jié)果而是把FIND定位結(jié)果放一列把長(zhǎng)度計(jì)算結(jié)果放一列最后MID那一列直接引用輔助列的結(jié)果。這樣公式短、邏輯清晰、計(jì)算快排查也方便。別覺(jué)得輔助列“不高級(jí)”在真正的業(yè)務(wù)報(bào)表里輔助列是救命的設(shè)計(jì)。尤其當(dāng)你要把公式轉(zhuǎn)交給不懂?dāng)?shù)組的同事維護(hù)時(shí)3個(gè)短公式遠(yuǎn)比1個(gè)長(zhǎng)嵌套公式容易維護(hù)。我在大型報(bào)表項(xiàng)目里默認(rèn)采用“一步一列”的工作方式等流程穩(wěn)定后再視情況合并某些公式。6.4 從外部系統(tǒng)導(dǎo)入的文本先洞察數(shù)據(jù)再動(dòng)筆最后一條經(jīng)驗(yàn)其實(shí)不是技術(shù)問(wèn)題而是工作習(xí)慣問(wèn)題。無(wú)論你是從ERP、CRM還是從某個(gè)網(wǎng)頁(yè)后臺(tái)導(dǎo)出數(shù)據(jù)拿到的文本都可能帶換行符、制表符、特殊前綴。我的流程永遠(yuǎn)是第一步用LEN檢查每個(gè)單元格的字符數(shù)看有沒(méi)有超出肉眼可見(jiàn)長(zhǎng)度的“隱藏尾巴”第二步用CODE對(duì)可疑字符做編碼檢查第三步確認(rèn)所有數(shù)據(jù)行的格式統(tǒng)一后才寫(xiě)MID公式。這三步花不了幾分鐘但能幫你確定公式寫(xiě)出來(lái)之后是不是“一版過(guò)”。我印象最深的一次是一個(gè)從SAP導(dǎo)出的字段每個(gè)值后面都帶了一個(gè)換行符Char(10)。表哥的第一版公式全部精確提取正確就是每個(gè)結(jié)果下面都多了一行空行。領(lǐng)導(dǎo)看到數(shù)據(jù)時(shí)一拉發(fā)現(xiàn)每個(gè)單元格都“多了一行”看了半天才反應(yīng)過(guò)來(lái)是換行符。這種問(wèn)題不復(fù)雜但處理起來(lái)很煩。所以我現(xiàn)在教別人用MID時(shí)第一句話(huà)永遠(yuǎn)是先看清楚你的源數(shù)據(jù)里到底有什么再想該怎么切。MID函數(shù)入門(mén)確實(shí)不難但想讓它成為你手里的“手術(shù)刀”關(guān)鍵是培養(yǎng)兩種能力一是把業(yè)務(wù)需求翻譯成“邊界線(xiàn)”的能力——從哪開(kāi)始、到哪結(jié)束二是處理邊界和異常情況的心態(tài)。我始終認(rèn)為優(yōu)秀的Excel用戶(hù)不是會(huì)背多少函數(shù)而是遇到臟數(shù)據(jù)時(shí)能平靜地拆解問(wèn)題、設(shè)計(jì)步驟、驗(yàn)證結(jié)果。希望這篇指南能幫你在文本處理這條路上少走一些彎路。