分享

Excel VBA 自定义函数mySum/忽略错误值求和/SUM函数的另类用法

 冷茶视界 2023-11-15 发布于江苏

☆本期内容概要☆

  • Sum函数的特性

  • 忽略错误值求和的方法

大家好,我是冷水泡茶,前一阵子我们分享过一篇EXCEL函数的文章(Excel 公式函数/你确定你会用Sum?),SUM函数比较简单,估计大家都会用,但有一点不方便的是,当单元格有错误值时,它也返回错误值,而且它会忽略文本型的数字,我们看几个测试的例子:

1、第一行,是一些数字与字母,其中前两个是文本型数字,也就是说它不是数字,用Sum求和=SUM(C1:S1),它忽略了不是数字的单元格,得出结果。
2、第二行,单元格值同上,这次我们用Sumif来求和,得出同样的结果:
=SUMIF(C2:S2,">0")+SUMIF(C2:S2,"<0")

3、第三行,单元格值同上,用自定义函数MYSUM,得出了我所希望的结果,把数值和文本型数字都加起来=mysum(C3:S3)。

4、第四行,加入一些错误值,直接用=SUM(C4:S4),得出错误值。

5、第五行,单元格值同上,用第二行的SUMIF的方法,忽略了错误值,但文本型数字同样也忽略了。

6、第六行,单元格值同上,用=mysum(C6:S6),也得出了我想要的结果,即把文本型数字当作数值参与计算。

说了半天,来看一下我们的自定义函数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    NextEnd Function

代码解析:循环选择的单元格,判断一下它是不是数值,是数值就把它转换成Double类型,再累加。

那么,除了自定定义函数,我们有没有其他公式函数达到类似的效果呢?我们来看一个例子:

U列,用的是一个公式,得到了与我们自定义函数同样的结果:

{=SUM(IFERROR(VALUE(C1:S1), 0))}

公式不长,但用了3个函数,而且是数组公式。

类似的,我们还可以这样写:

{=SUM(IFERROR(C1:S1*1,0))}

这里用IFERROR把错误值转换成0,乘上1,把文本型数字强制变成数值。

写到这里的时候,我忽然觉得,第二行的SUMIF公式,是不是可以写成:

=SUMIF(C2:S2,"<>0")

赶紧试一下,第二行可以,得出同样的结果,但第五行就不行了,得出了错误值。于是上网搜了搜,原来,在EXCEL中,错误值是不等于0的,所以条件为"<>0"时,它包括了错误值,结果自然就返回错误值了。

最后,我们提醒一下,我们在求和时,最好能确保所有单元格都是数值,以防得出错误的结果。如果是一列数数据,我们可以进行一下“分列”操作,把文本型数字转换成数值再求和。

对于错误值,一般是在我们计算、查找取值过程中所产生的,我们可以预先进行处理,比如用IFERROR函数,ISERROR函数结合IF函数等方式避免出现错误值。当然,错误值有时候也有它的作处,比如根据不同的错误值,我们可以知道出现这种错误的原因是什么。

我们今天所分享的自定义函数mySum,只是为了说明一种解决问题的思路与方法,就我个人而言,实际并没有太大的实用价值,可能也不会实际使用它,但我们可以参考它的VBA代码。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多