本例通過提取單元格文本中唯一的正整數(shù)來介紹幾個文本函數(shù)的用法。注意:示例數(shù)據(jù)的解法很多,文章中給出的解法也不是在探討最優(yōu)解法。并且,本例旨在介紹函數(shù)用法,文本中數(shù)字為負數(shù)、不連續(xù)、帶小數(shù)點、有英文字母等情況,不在本文討論范圍之內(nèi)。 基本思路和使用函數(shù)說明 要提取上圖A2單元格文本中的數(shù)字,如果能確定第一個數(shù)字出現(xiàn)的位置,然后確定數(shù)字的個數(shù),就可以用MID函數(shù)提取出來了。 本例解決方案用到的函數(shù)及目的主要如下: 1)MID和MIDB函數(shù),從第一個數(shù)字出現(xiàn)位置起取數(shù)字個數(shù)那么多位,以達到把數(shù)字提取出來的目的; 2)SEARCHB函數(shù),可以使用通配符查到第一個數(shù)字出現(xiàn)的位置; 3)FIND函數(shù),可以查找到第一個數(shù)字出現(xiàn)的位置; 4)COUNT函數(shù),“數(shù)”出文本中數(shù)字的個數(shù); 5)MAX和MIN函數(shù),提取相關(guān)數(shù)字。 查找第一個數(shù)字出現(xiàn)的位置 第一種方法:SEARCHB函數(shù),函數(shù)基本用法如下(第三參數(shù)忽略): =SEARCHB(待查找的文本,包含待查找文本的目標(biāo)文本) SEARCHB函數(shù)用途是在第二參數(shù)中查找第一參數(shù)出現(xiàn)的位置,查找是按字節(jié)的,一個漢字占兩個字節(jié),普通數(shù)字和英文占一個字節(jié)。 并且,SEARCHB函數(shù)可以使用通配符,比如“?”就代替一個單字節(jié)字符。 如下圖,在B2輸入: =SEARCHB('?',A2) 結(jié)果返回7,也就是第一個單字節(jié)字符(也就是第一個數(shù)字4)出現(xiàn)的位置是7,因為前面有“七連第”3個漢字,占6個字節(jié),所以“4”是第7個字節(jié)。 第二種方法:FIND函數(shù),函數(shù)基本用法如下(第三參數(shù)忽略): =FIND(待查找的文本,包含待查找文本的目標(biāo)文本) 和SEARCHB函數(shù)類似,F(xiàn)IND函數(shù)查找第一參數(shù)在第二參數(shù)中出現(xiàn)的位置。例如: =FIND('中','我是中國人')=3,因為第一參數(shù)“中”在第二參數(shù)“我是中國人”里是第3個字符。 我們在B2輸入函數(shù)并按Ctrl Shift Enter運行: =MIN(FIND(ROW(1:10)-1,A2&1/17)) 結(jié)果返回4,也就是說A2文本中第一個數(shù)字出現(xiàn)的位置是4。 下面來簡單解釋一下函數(shù)的用法: ROW(1:10)返回{1;2;3;4;5;6;7;8;9;10}這樣一個數(shù)組,由于我們要查找的是單個數(shù)字,所以需要再減去1,也就是:ROW(1:10)-1。ROW(1:10)-1返回{0;1;2;3;4;5;6;7;8;9},也即0~9的10個數(shù)字。 FIND(ROW(1:10)-1,A2),也就是FIND({0;1;2;3;4;5;6;7;8;9},A2)可以查找0~9在A2文本中分別出現(xiàn)的位置。 但是如果A2文本中沒有某個數(shù)字,比如說沒有7,F(xiàn)IND部分就會返回錯誤值。 為了避免這個問題,我們在A2文本后加上'0123456789',也就是A2&'0123456789',這樣,F(xiàn)IND函數(shù)不會返回錯誤值,因為即使A2文本中沒有某個數(shù)字,也能在A2&'0123456789'中查到。 上面的函數(shù)中實際輸入的是A2&1/17,為什么這樣呢,因為1/17=0.0588235294117647,這個小數(shù)中包含0~9的所有數(shù)字。 5^19也有相同作用。 FIND(ROW(1:10)-1,A2&1/17)返回:{9;21;15;16;4;5;24;23;13;6},也即0~9這10個數(shù)字分別在A2&1/17這個文本中出現(xiàn)的位置,我們?nèi)∽钚≈稻褪堑?個數(shù)字出現(xiàn)的位置即可,因此外層嵌套MIN函數(shù)。即: =MIN(FIND(ROW(1:10)-1,A2&1/17)) 判斷A2文本中數(shù)字的個數(shù) 第一種方法:COUNT函數(shù)。COUNT函數(shù)返回結(jié)果為其參數(shù)中的數(shù)字個數(shù)。 因此,我們輸入: =COUNT(-MID(A2,ROW(1:99),1)) 其中MID(A2,ROW(1:99),1)部分的意義是: 從A2文本中第1個,第2個……第99個字符開始,分別取1個字符,也就是將A2單元格按單個字符拆分,返回: ={'七';'連';'第';'4';'5';'9';'個';'兵';……;''} 我們加上一個減號,就將文本數(shù)字轉(zhuǎn)化成數(shù)值,文本轉(zhuǎn)化成錯誤值, -MID(A2,ROW(1:99),1)返回: {#VALUE!;#VALUE!;#VALUE!;-4;-5;-9;#VALUE!;……;#VALUE!} 然后用COUNT({#VALUE!;#VALUE!;#VALUE!;-4;-5;-9;#VALUE!;……;#VALUE!} )數(shù)出一共有3個數(shù)字,也就是A2文本中數(shù)字的個數(shù)。 第二種方法:LEN和LENB函數(shù)方法。 LEN和LENB函數(shù)都返回參數(shù)字符長度,但是LENB按單字節(jié)個數(shù)計,LEN不區(qū)分。 例如: =LEN('中國1汽')=4 =LENB('中國1汽')=7 我們輸入下面公式獲得A2單元格文本中數(shù)字個數(shù): =2*LEN(A2)-LENB(A2) 原理:假設(shè)A2文本中的數(shù)字都是雙字節(jié),那么2*LEN(A2)=LENB(A2),但是數(shù)字實際上是單字節(jié)的,那么2*LEN(A2)比LENB(A2)大幾就是有幾個單字節(jié)的字符(本例中就是數(shù)字)。 組合上述函數(shù),提取數(shù)字 根據(jù)最初的思路分析,將上面的數(shù)字出現(xiàn)位置和數(shù)字個數(shù)函數(shù)組合一下,就得到: =MIDB(A2,SEARCHB('?',A2),2*LEN(A2)-LENB(A2)) =MID(A2,MIN(FIND(ROW(1:10)-1,A2&1/17)),2*LEN(A2)-LENB(A2)) =MID(A2,MIN(FIND(ROW(1:10)-1,A2&1/17)),COUNT(-MID(A2,ROW(1:99),1))) =MIDB(A2,SEARCHB('?',A2),COUNT(-MID(A2,ROW(1:99),1))) 補充一個方法 單純就本例數(shù)據(jù)而言,輸入下面公式,然后按Ctrl Shift Enter也可以返回正確結(jié)果: =MAX(IFERROR(--MID(A2,ROW(1:99),COLUMN(A:Z)),)) 至于用法和原理,大家可以自己動手在表格中試驗一下。 關(guān)于SEARCH,SEARCHB,MID,MIDB,F(xiàn)IND和FINDB函數(shù)之間的區(qū)別和聯(lián)系,建議大家去Excelhome論壇中“知識樹”欄目下的文本函數(shù)中去查看詳細信息。 作者:ExcelHome論壇版主 shaowu459 |
|
來自: L羅樂 > 《字符提?。ㄎ谋竞\用)》