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