1. 程式人生 > >用函式在Excel中從文字字串提取數字

用函式在Excel中從文字字串提取數字

Excel輸入資料過程中,經常出現在單元格中輸入這樣的字串:GH0012JI、ACVB908、華升12-58JK、五香12.56元、0001#、010258等。在進行資料處理時,又需要把其中的數字0012、908、12-58、12.56、0001提取出來。

如何通過使用Excel的工作表函式,提取出字串中的數字?

一、問題分析

對於已經輸入單元格中的字串,每一個字元在字串中都有自己固定的位置,這個固定位置都可以用序列數(1、2、3、……)來表示,用這些序列數可以構成一個可用的常數陣列

以字串“五香12.56元”為例:序列數1、2、3、4、5、6、7、8分別對應著字串“五香12.56元”中字元“五”、“香”、“1”、“2”、“.”、“5”、“6”、“元”。由序列陣列成一個儲存在記憶體中的新陣列{1;2;3;4;5;6;7;8}(用列的形式儲存),對應字串中的字元構成的陣列{“五”;“香”;“1”;“2”;“.”;“5”;“6”;“元”}。因此解決問題可以從陣列著手思考。

二、思路框架

問題的關鍵是,如何用序列數重點描述出字串中的數字部分的起始位置和終止位置,從而用MID函式從指定位置開始提取出指定個數的字元(數字)。

不難看出,兩個儲存在記憶體中的新陣列:

{“五”;“香”;“1”;“2”;“.”;“5”;“6”;“元”}

{1;2;3;4;5;6;7;8}

陣列具有相同大小的資料範圍,而後一個數組中的每一個數值可以準確地描述出字串中字元位置。

字元與序列數的對應關係如下表所示:

字元     字元位置

五  ——    1

香  ——    2

1   ——    3

2   ——    4

.   ——    5

5   ——    6

6   ——    7

元  ——    8

所以解決問題的基本框架是:

用MID函式從字串的第一個數字位置起提取到最後一個數字止的字元個數。即{=MID(字串,第一個數字位置,最後一個字元位置-第一個字元位置+1}。其中“+1”是補上最後一個數字位置減去第一個數字位置而減少的一個數字位。

三、解決方案及步驟

假定字串輸入在A2單元格。

⑴確定A2中字串的長度。

即用LEN函式計算出A2中字串中字元的個數,這個字元個數值就是字串中最後一個字元在字串中的位置:LEN(A2)。

⑵確認字串中的每一個字元位置序列陣列成的新陣列。

用INDIRECT函式返回一個由文字字串指定的引用:

=INDIRECT("1:"&LEN($A2))

用返回行數的函式ROW確定文字引用INDIRECT("1:"&LEN($A2))構成的新陣列:{=ROW(INDIRECT("1:"&LEN($A2)))}

⑶用按指定位置開始返回指定個數字元的函式MID返回由新陣列{=ROW(INDIRECT("1:"&LEN($A2)))}確定位置的每一個字元,並將文字轉化成數值型資料:

{=--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)}

注意:

函式MID返回的字元是文字,將文字轉化為數值型資料,可以用函式VALUE,也可以同等功能地用符號“- -”或“+0”或“-0”簡化表達,這裡用“- -”表示。

⑷函式ISNUMBER判別MID函式提取出來的字元是不是數字,是數字返回TRUE,不是數字返回FALSE。

具體公式是:

{=ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1))}

邏輯函式IF根據用函式ISNUMBER檢測MID函式提取出來的字元是否數值的真假,返回數字字元在字串中的位置,如果不是數字則返回空白字元。

具體公式是:

{=IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),"")}

⑹用MIN函式返回數字位置陣列成陣列中的最小數。

具體公式是:

{=MIN(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))}

⑺用MAX函式返回數字位置陣列中的最大數。

具體公式是:

{=MAX(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))}

⑻確認字串中第一個數字的起始位置:

{=MIN(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))}

⑼確認字串中第一個數字與最後一個數字之間的字元個數:

{=MAX(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))- MIN(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))+1}

注意:

公式中的“+1”,是對字串中最後一個數字位數減去第一個數字位數,造成第一個數字與最後一個數字之間的字元個數少1的補充。

⑽用函式MID在A1中按指定位置開始提取指定個數的字元(數字)。

綜上所述,第⑻步的公式為MID函式的第2個引數,第⑼步的公式為MID函式的第3個引數。組合後提取A1中數字的具體公式如下。

在B2單元格編輯公式:

=MID($A2,MIN(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),"")),MAX(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))-MIN(IF(ISNUMBER(--MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),ROW(INDIRECT("1:"&LEN($A2))),""))+1)

用三鍵確認公式輸入,即用組合鍵Ctrl+Shift+Enter進行公式確認。

本公式不適用的文字字串型別:形如WE1234GH098PIU等。

四、適當簡化公式

基於文字數字轉化為數值型數字表達方式——用函式VALUE、符號“--”和“+0”或“-0”效果完全一致,所以具體的提取文字中數字的公式可以適當簡化為:

{=MID($A2,MIN(IF(ISNUMBER(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)+0),ROW(INDIRECT("1:"&LEN($A2))))),MAX(IF(ISNUMBER(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)+0),ROW(INDIRECT("1:"&LEN($A2)))))-MIN(IF(ISNUMBER(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)+0),ROW(INDIRECT("1:"&LEN($A2)))))+1)}

五、編後語

特別指出,對於提取文字中的數字,本公式不是最簡方法,同時也不一定是最佳方案。

通過對字串中數字的提取操作,試圖用Excel的工作表函式直接來完成原始的數字提取工作,因此編輯的公式冗長;庖丁解牛的解決方案試圖說明對文字中數字提取的想法和函式、陣列原始的理解及使用,從而描述清楚整個公式構成框架。