c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和
本篇的主題是將單元格內一串文本,找出所有數字并求和,如下圖。
難度較高,新手建議僅了解下,先學會數組運用,再研究此知識點。
廢話少說,步入正題。
重點說明:本篇只針對文本內整數的數字進行提取并求和,如果含小數點,此方式無效。
首先:解這道題,需要構思方法,本篇以作者的方法進行描述,思路是用LEFT函數逐步提取內容,我們以第一個文本作為例子,如下圖:
對于有一定水平的朋友解決上圖應該不難,無非就是利用LEFT+ROW函數進行逐步提取。
原文本中明明只有14個字符,為什么要做15個呢?因為每個單元格不知道有多少個字符,寧可多不可少,也可以設置99位,只要比所有單元格中文本個數最多的那個更多即可。
有朋友會說,第14行與第15行是一樣的,不會影響計算結果嗎?其實不會影響,上圖中我們最終的目的是將15個單元格內容從右向左進行提取,只要能對準第8行和第13行,將這兩行向左提取數字的位數,數字就能被提取出來,但上圖中最右側可不止這兩行是純數字,那么我們就要一一對應,怎么對應呢?我們再看一個圖。
公式:
LEFT(A3,ROW($A$1:$A$15))
當LEFT函數第一參數為文本,第二參數為右側的提取位數時,0值返回的是錯誤值,第8行的數字3,和第13行的數字2,將是我們真正要提取的內容,錯誤值很好處理,最終形成數組去掉錯誤值,再用SUM函數進行求和就能得到我們最終的計算結果。
看到這里,我們能想到,核心方式就是右側的提取位數,只要位數出來,問題就迎刃而解,我們需要利用FREQUENCY函數的頻率分布,確認每個文本(非數字)之間的頻率。
上圖是頻率的思路,只有8行,無法和15行進行對應,怎么才能對應呢?
我們先來拆解FREQUENCY函數每個參數得到的結果是什么。
說明:上圖中描述為了更清晰,均未加絕對引用,在實際操作過程中,公式內所有區域都必須加絕對引用,否則下拉將改變區域。
公式:
ISERR(--MID(B3,ROW($A$1:$A$15),1))*ROW($A$1:$A$15)
思路:左側得到1~15的行號,右側A項拆分每個字符,B項使用 兩個減號 轉換成數字格式(文本為亂碼)后,用ISERR函數判斷文本邏輯值(亂碼的邏輯值是TRUE),C項繼續得到1~15行號,D項將B和C兩項相乘,即行號順序不變,純數字變成0了。這樣就能和拆分的文本進行一一對應,如果是文本,則按照1~15數字的順序排列,遇到數字,則直接顯示0,然后利用FREQUENCY函數,用第二參數在第一參數內逐個找頻率。
我們將得到的頻率的結果,與我們理想中的結果進行對比,并用RIGHT函數對頻率結果進行測試。
公式:
FREQUENCY(ROW($A$1:$A$15),ISERR(--MID(A3,ROW($A$1:$A$15),1))*ROW($A$1:$A$15))
完全亂套了,但我們發現,1~5行頻率結果有數字1,而不是0,但是我們就算是1,用RIGHT函數提取出來的也是文本字符,不影響,隨便是幾,只要提取出來的不是純數字,就能滿足我們的要求,6~8行是0,不管它。
整體來看,能滿足我們要求的是數字4和數字3,不僅和理想結果錯了一位,還比理想結果大一位,都是有規律的,錯一位,我們可以將文本拆解前組合任意單字符,再來看效果。
前面加一個符號,這樣就對稱了。
(我們例題中最多是15位數,當加了一個字符后正好是15位,大家在實際操作過程中千萬不能卡的那么準,盡量大一點,也不能大太多,因為會嚴重影響速度,比如預測最多有50個字符,我們可以設置成100即可)
公式:
LEFT("@"&A3,ROW($A$1:$A$15))
雖然是對稱了,但是頻率結果都比理想結果大1位,這樣也好辦,我們再到右側組合一個空白字符即可,這里有個細節,如果直接在原文本右側加空格,是沒用的,因為第一位還是“@”,第二位還是字符“@E”,因此我們在用LEFT函數逐步提取完成后,再來組合空白字符。
(為什么是空白字符呢?因為RIGHT函數提取后,文本無法轉換成數字,空白可在轉換時自動去掉,數字+空白經過轉換等于數值)
每一個提取的文本后面加上一個空白字符后,頻率為1的提取的都是空白,對應的數字4和數字3則提取的我們最終的數字(后面帶空格)
公式:
LEFT(" "&A3,ROW($A$1:$A$15))&" "
為了方便大家復制,我們將上述中最終版公式列舉出來。
左側公式:
LEFT(" "&A3,ROW($A$1:$A$15))&" "
右側公式:
FREQUENCY(ROW($A$1:$A$15),ISERR(--MID(A3,ROW($A$1:$A$15),1))*ROW($A$1:$A$15))
然后使用RIGHT函數進行組合組合:
RIGHT(左側公式,右側公式)*1
公式右側乘1的目的是將文本數字轉換成真正數字
(空白不影響,直接自動去掉了)
得到的一組數中有亂碼和純數字,再嵌套一層IFERROR函數去掉亂碼,最后嵌套一層SUM函數進行求和。
最終完整版公式:
=SUM(IFERROR(RIGHT(LEFT(" "&A3,ROW($A$1:$A$15))&" ",FREQUENCY(ROW($A$1:$A$15),ISERR(MID(A3,ROW($A$1:$A$15),1)*1)*ROW($A$1:$A$15)))*1,""))
結語:
◆有的人會覺得,我可以用輔助,或者16版本的CTRL+E,又或者VBA正則去處理,我想說,函數玩的就是思路,當你水平上升到一定程度,當年看似非常難的問題,現在你可能幾分鐘就能解決,先苦后甜,是一樣的道理;
你可以用16版快捷鍵,但遇到快捷鍵無法處理的怎么辦?
你可以用輔助,如果不需要繼續深入學下去,輔助是最合適的,有個段子,沒有什么是IF解決不了的,輔助也同樣適用,但只能局限于當前水平;
你也可以用VBA正則去處理,首先你得有VBA的水平,沒有水平等于白說。
函數學到一定程度去學VBA最合適(至少VBA會調用工作表函數),如果函數基礎差,甚至常用函數都不會,學VBA只會舉步維艱,這是作者總結的經驗,希望大家受益!
◆學而不用則殆,希望大家學習后利用到自己的工作中,哪怕是點滴的應用,也是一種進步。給自己的工作帶來非常大的方便。
免費微信交流群:liuou5201314
總結
以上是生活随笔為你收集整理的c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 安卓图标删除不了(安卓图标删除)
- 下一篇: DDOS工具(c ddos工具)
