☆本期內(nèi)容概要☆
Sum函數(shù)的特性
忽略錯誤值求和的方法
大家好,我是冷水泡茶,前一陣子我們分享過一篇EXCEL函數(shù)的文章(Excel 公式函數(shù)/你確定你會用Sum?),SUM函數(shù)比較簡單,估計大家都會用,但有一點不方便的是,當單元格有錯誤值時,它也返回錯誤值,而且它會忽略文本型的數(shù)字,我們看幾個測試的例子:
=SUMIF(C2:S2,">0")+SUMIF(C2:S2,"<0")
3、第三行,單元格值同上,用自定義函數(shù)MYSUM,得出了我所希望的結(jié)果,把數(shù)值和文本型數(shù)字都加起來=mysum(C3:S3)。
4、第四行,加入一些錯誤值,直接用=SUM(C4:S4),得出錯誤值。
5、第五行,單元格值同上,用第二行的SUMIF的方法,忽略了錯誤值,但文本型數(shù)字同樣也忽略了。
6、第六行,單元格值同上,用=mysum(C6:S6),也得出了我想要的結(jié)果,即把文本型數(shù)字當作數(shù)值參與計算。
說了半天,來看一下我們的自定義函數(shù)mySum是什么樣的,其實很簡單:
Function mySum(rng As Range) As Double
Dim cell As Range
mySum = 0
For Each cell In rng
If IsNumeric(cell.Value) Then
mySum = mySum + CDbl(cell.Value)
End If
Next
End Function
代碼解析:循環(huán)選擇的單元格,判斷一下它是不是數(shù)值,是數(shù)值就把它轉(zhuǎn)換成Double類型,再累加。
那么,除了自定定義函數(shù),我們有沒有其他公式函數(shù)達到類似的效果呢?我們來看一個例子:
U列,用的是一個公式,得到了與我們自定義函數(shù)同樣的結(jié)果:
{=SUM(IFERROR(VALUE(C1:S1), 0))}
公式不長,但用了3個函數(shù),而且是數(shù)組公式。
類似的,我們還可以這樣寫:
{=SUM(IFERROR(C1:S1*1,0))}
這里用IFERROR把錯誤值轉(zhuǎn)換成0,乘上1,把文本型數(shù)字強制變成數(shù)值。
寫到這里的時候,我忽然覺得,第二行的SUMIF公式,是不是可以寫成:
=SUMIF(C2:S2,"<>0")
趕緊試一下,第二行可以,得出同樣的結(jié)果,但第五行就不行了,得出了錯誤值。于是上網(wǎng)搜了搜,原來,在EXCEL中,錯誤值是不等于0的,所以條件為"<>0"時,它包括了錯誤值,結(jié)果自然就返回錯誤值了。
最后,我們提醒一下,我們在求和時,最好能確保所有單元格都是數(shù)值,以防得出錯誤的結(jié)果。如果是一列數(shù)數(shù)據(jù),我們可以進行一下“分列”操作,把文本型數(shù)字轉(zhuǎn)換成數(shù)值再求和。
對于錯誤值,一般是在我們計算、查找取值過程中所產(chǎn)生的,我們可以預先進行處理,比如用IFERROR函數(shù),ISERROR函數(shù)結(jié)合IF函數(shù)等方式避免出現(xiàn)錯誤值。當然,錯誤值有時候也有它的作處,比如根據(jù)不同的錯誤值,我們可以知道出現(xiàn)這種錯誤的原因是什么。
我們今天所分享的自定義函數(shù)mySum,只是為了說明一種解決問題的思路與方法,就我個人而言,實際并沒有太大的實用價值,可能也不會實際使用它,但我們可以參考它的VBA代碼。
聯(lián)系客服