在一些有規律的字符串中提取字符或是將多個字符根據條件進行合併,是數據處理過程中的一項基礎性的操作,用於字符提取與合併的函數主要有MID 函數、RIGHT 函數和 LEFT函數等。
示例 5-46 分別提取中文物料名稱和英文數字規格型號
圖5-68 展示了某公司物料明細表的部分內容,A 列是物料名稱和規格型號的混合內容,需要在 B 列和 C 列分別提取出物料名稱和規格型號。
圖5-68物料明細表
B2 單元格輸入以下公式,提取出物料名稱,將公式向下複製填充到數據表最後一行。=LEFT(A2,LENB(A2)-LEN(A2))
C2 單元格輸入以下公式,提取出規格型號,將公式向下複製填充到數據表最後一行。=RIGHT(A2,LEN(A2)*2-LENB(A2))
LEN函數和LENB函數用於統計字符長度。LEN函數對任意單個字符都按一個長度計算。LENB 函數則將任意單個的單字節字符按一個長度計算,將任意單個的雙字節字符按兩個長度計算。
雙字節字符又稱為全形字符,是指一個字符佔用兩個標準字符位置的字符,所有中文字符均為雙字節字符。半角字符是指一個字符佔用一個標準字符位置的字符,又稱為單字節字符。在英文輸入法狀態下輸入的字符,默認就是半角字符。
LEFT 函數和 RIGHT 函數的作用是從字符串的左 / 右側開始,提取指定數量的字符,函數語法如下。
LEFT(text,[num_chars])
RIGHT(text,[num_chars])
第一參數是要提取的字符串或單元格引用,第二參數指定要提取幾個字符,如果省略第二參數時,會默認提取最左 / 右側的一個字符。
字符串的提取,先要觀察數據的分布規律。本例中的數據都是以中文的全形字符開頭,隨後是字母或是數字等半角字符,提取之前,需要先確定好全形字符和半角字符的個數。
已知一個全形字符的字節數等於兩個半角字符的字節數,因此全形字符個數= 字節數 -符數。
半角字符個數 = 字符數 - 全形字符個數,也就是 = 字符數 -( 字節數 -字符數 ),或者寫成 = 字符數 + 字符數 - 字節數。繼續修約,則半角字符個數的公式變成 = 字符數 *2- 字節數。
B2 單元格公式中先使用「LENB(A2)-LEN(A2)」得到全形字符的個數。再使用LEFT 函數從 A2 單元格的左側開始,根據計算出的全形字符個數,提取出該單元格中的物料名稱。
C2 單元格中的公式使用「LEN(A2)*2-LENB(A2)」得到半角字符的個數,再使用 RIGHT函數從 A2 單元格右側開始,根據計算出的半角字符個數,提取出該單元格中的規格型號。
注意:本例的計算方法僅適用於中文作業系統下的中文版 Excel。
在一些有固定間隔符號的字符中提取數字時,可以藉助 FIND 函數完成。圖 5-69 展示了某保健品經銷商進貨明細表的部分內容,E 列的零售價是數字和文字的混合內容,需要從中提取出零售價數字。F2 單元格輸入以下公式,將公式向下複製到數據表的最後一行。 =LEFT(E2,FIND("/",E2)-1)*1觀察 E 列的數據可以發現,零售價金額都是在最左側,和後面的單位之間以「/」作為間隔符號。因此只要確定「/」的位置,然後提取出「/」左側的數字即可。FIND 函數能夠根據指定的字符串,在另一個單元格或字符串中定位這個字符串首次出現的位置。函數語法如下。 FIND(fifind_text,within_text,[start_num])第一參數是要查找的字符。第二參數用於指定要在哪些單元格或字符串中進行查找。第三參數是可選參數,用於指定從第二參數的第幾個字符位置處開始查找。省略該參數時,默認為 1。無論第三參數是否為 1,FIND 函數最終返回的位置都是以第二參數的首個字符開始計算。如果第二參數中不包含要查找的內容,結果將返回錯誤值#VALUE!。本例中,FIND 函數以「/」作為查找內容,在 E2 單元格中查找「/」首次出現的位置,返回結果為 4。再將這個結果減去 1,作為 LEFT 函數的第二參數,最終提取出首個「/」之前的數字。由於 LEFT 函數、RIGHT 函數等文本類函數的提取結果都是文本型內容,因此最後用乘1 的方式,將文本型數字轉換為數值如果要檢測字符中是否包含並返回某些關鍵字,可以使用 FIND 函數結合LOOKUP 函數完成。圖 5-70 展示了某公司物料盤點表的部分內容,需要根據 B 列物料名稱中包含的關鍵字,以 H 列的對照表作為參照,判斷物料所屬大類。F2 單元格輸入以下公式,將公式向下複製填充到數據表最後一行。=LOOKUP(1,0/FIND(H$2:H$5,B2),H$2:H$5)
公式中的「FIND(H$2:H$5,B2)」部分,分別查找 H$2:H$5 單元格區域中每個關鍵詞在B2 單元格中首次出現的位置。如果 B2 單元格中包含其中的某個關鍵詞,結果返回表示位置的數字,否則返回錯誤值。
{5;#VALUE!;#VALUE!;#VALUE!}
然後使用 0 除以該內存數組,使其變成由 0 和錯誤值構成的新內存數組。
{0;#VALUE!;#VALUE!;#VALUE!}
最後使用 LOOKUP 函數,以數值 1 作為查詢值在內存數組中查找。由於找不到 1,因此以小於 1 的最接近值 0 進行匹配,並返回第三參數 H$2:H$5 單元格區域中對應位置的內容「PP」。
要按照分類對指定內容進行合併時,可以使用 TEXTJOIN 函數完成。
示例 5-49 合併同一分店的發票號碼
圖 5-71 展示了某公司下屬分店的部分銷售開票記錄,需要按照不同的分店將發票號碼合併到同一個單元格。
圖5-71銷售開票記錄
步 驟 1複製 H 列的分店名稱,粘貼到 K 列,然後單擊 K 列數據區域的任意單元格(如K2),切換到【數據】選項卡下,單擊【刪除重複值】按鈕。在彈出的【刪除重複值】對話框中保留默認設置,單擊【確定】按鈕,在彈出的提示對話框中再次單擊【確定】按鈕,完成不重複分店名稱的提取,如圖 5-72 所示。
步 驟 2在 L1 單元格輸入欄位標題「發票號碼」,然後在 L2 單元格輸入以下數組公式,按< Ctrl+ Shift+Enter >組合鍵,再將公式複製填充到數據表最後一行,如圖 5-73所示。{=TEXTJOIN("、",TRUE,IF(H$2:H$184=K2,A$2:A$184,""))}
圖5-72刪除重複值
圖5-73合併同一分店的發票號碼
TEXTJOIN 函數的作用是使用指定的分隔符號,連接多個單元格或多個字符串。函數語法如下。
TEXTJOIN(delimiter,ignore_empty,text1,[text2],…)
第一參數是指定的分隔符類型。第二參數是邏輯值,用於指定是否忽略連接內容中的空單元格或空文本,選擇 1 或 TURE 為忽略,選擇 0 或 FALSE 為不忽略。第三參數是要連接的單元格區域或是數組。
本例中的「IF(H$2:H$184=K2,A$2:A$184,"")」部分,如果 K2單元格的分店名稱等於H 列的分店名稱,IF 函數返回 A$2:A$184單元格區域中對應的發票號碼,否則返回空文本 ""。得到內存數組結果為:
{15005006;"";"";"";"";"";"";"";……;"";"";"";"";"";""}
再使用 TEXTJOIN 函數連接該內存數組中的各個元素,第一參數為指定的間隔符號「、」,第二參數使用邏輯值 TRUE,表示忽略內存數組中的空文本,最終完成同一分店下所有發票號碼的連接。
除了使用查找替換功能來批量替換字符,還可以使用替換類函數將字符串中的部分或全部內容替換成新的字符串。如圖 5-74 所示,A 列是一些從系統導出的內容,同一個單元格內包含有科目代碼和各級科目名稱,不同項目之間使用「/」間隔,需要將這些內容分別拆分到右側各列中。B2 單元格輸入以下公式,將公式複製填充到 B2:E25 單元格區域。=TRIM(MID(SUBSTITUTE($A2,"/",REPT("",99)),COLUMN(A1)*99-98,99))REPT 函數的作用是根據指定的次數重複顯示字符。COLUMN 函數的作用是返回參數的列號,如果省略參數,則返回公式所在單元格的列號。本例中的「COLUMN(A1)*99-98」部分,先使用 COLUMN 函數返回 A1 單元格的列號1,再用 COLUMN 函數的結果乘以 99 減 98,即 1*99-98,結果仍然是 1。當公式向右複製時,COLUMN 函數會依次得到 B1、C1……的列號,再將這些列號乘以 99 減 98,即相當於 2*99-98、3*99-98……,最終得到按 99 遞增的序號 1、100、199……,以此作為 MID函數的第二參數。 SUBSTITUTE 函數的作用是將字符串中的指定字符替換為新的字符,函數語法如下。SUBSTITUTE(text,old_text,new_text,[instance_num])第三參數指定要將原有字符替換成什麼內容,如該參數為空文本或僅保留參數之前的逗號時,相當於將需要替換的字符刪除。第四參數是可選參數,當第一參數中包含有多個要替換的字符時,該參數指定要替換第幾個。省略該參數時,則表示全部替換。公式中的「SUBSTITUTE($A2,"/",REPT(" ",99))」部分,先使用「REPT(" ",99)」將空格重複 99 次,最終得到 99 個空格。再使用 SUBSTITUTE 函數將 A2 單元格中的每一個分隔符「/」都替換為99 個空格,使其變成以下樣式的新字符串。"119301 往來中轉 通賠"接下來使用 MID 函數,從 SUBSTITUTE 函數返回的字符串中提取字符,提取的起始位置是「COLUMN(A1)*99-98」得到的序號 1,提取長度為 99 個字符,結果如下。最後使用 TRIM 函數清除字符串中的多餘空格,得到科目代碼「119301」。當公式向右複製時,MID 函數分別從 SUBSTITUTE 函數返回字符串中的第 1 位、第100 位、第 199 位……依次提取出 99 個字符,並使用 TRIM 函數清除多餘空格,最終得到不同的科目代碼和科目名稱。 提示:公式中的 99 可以是其他一個較大的數字,目的是增加原有字符串中各個科目之間的間隔寬度,以便於 MID 函數分段截取出帶空格的字符。推薦閱讀
北京大學出版社
Excel數據處理與分析應用大全
內容簡介:
本書全面系統地介紹了以 Excel 為核心工具開展數據處理與數據分析的各項技術,深入揭示背後的概念原理,並配以大量典型實用的應用案例,幫助讀者全面掌握數據分析工作的必備技能。全書分17 章,內容包括數據分析概述、數據採集、數據輸入、數據整理、藉助公式快速完成統計計算、藉助數據透視表快速完成統計計算、基礎統計分析、中心極限定理、假設檢驗、t 檢驗和卡方檢驗、方差分析、回歸分析、時間序列分析、規劃求解、Excel 數據表格美化、數據可視化和其他常用數據分析工具, 方便讀者隨時查閱。
本書適合各層次的數據分析從業人員,既可作為初學者的入門指南,又可作為中、高級用戶的參考手冊。書中大量的實例還適合讀者直接在工作中借鑑。
作者簡介:
Excel Home是微軟在線社區聯盟成員,全球華語Excel資源網站,擁有大量原創技術文章、視頻教程、加載宏及模板。Excel Home是一個學習氛圍濃厚的技術交流社區,中國大陸及中國港臺各行各業身懷絕技的Office高手都匯聚於此,目前已有三百多萬辦公人士選擇成為它的註冊會員。Excel Home已精心編寫並出版Office領域的圖書60餘種,截至2016年春節,圖書銷量累計達120多萬冊。