这些总和函数之间的可靠性有差异吗?

所以有一天我得到了一些奇怪的总和值,我完全被困住了。 我放弃了在VBA中使用sum函数,只是通过很长的path(通过循环)添加了值,但是接着我读到了在VBA中使用sum函数并不总是可靠的地方? (我找不到post了,但我还在找)。

有没有道理呢? 我知道很多人有不同的方式从一系列的细胞中获得总和 – 不要太自以为是 ,哪一个会返回最准确的结果呢?

Sub testsums() Dim metric1 As Integer, metric2 As Integer, metric3 As Integer metric1 = Application.Sum(Range(("A1"), ("Z1"))) metric2 = Application.WorksheetFunction.Sum(Range(("A1"), ("Z1"))) metric3 = WorksheetFunction.Sum(Range(("A1"), ("Z1"))) End Sub 

我正在努力重现我的错误 – 基本上,当循环遍历许多行(15,000+)并获得总和时,有些返回零,他们本来不应该。

  • Application.Sum(Range(("A1"), ("Z1")))

    这是对Excel.Application的后期调用,在运行时解决; 和任何迟到的调用一样(例如,针对ObjectVariant ),你不会得到智能感知,没有自动完成,也没有编译时validation,不pipe是因为名字中的拼写错误还是命令或参数数量。 如果调用无效或函数导致错误,则返回一个Error值,您可以使用IsError VBA函数进行validation(当然,如果函数名称中有错字,您将得到的是运行时错误#438“对象不支持此属性或方法”)。

    是什么让这个语法工作的事实是, Excel.Application COM接口有一个标志,使其可扩展 – 我不知道是否它是直接WorksheetFunction接口扩展,或者如果它只是加倍成员,但无论如何,这是发生了什么事情:在编译时调用Application接口上不存在的成员。

  • Application.WorksheetFunction.Sum(Range(("A1"), ("Z1")))

    这是对Excel.WorksheetFunction的早期调用,在编译时解决; 您可以获得智能感知,自动完成和编译时validation。 错字将无法编译,因为将丢失所需的参数。 如果调用无效或者该函数导致错误,则会引发 VBA运行时错误,您可以使用标准的VBA惯用error handling方式使用On Error语句处理错误。

  • WorksheetFunction.Sum(Range(("A1"), ("Z1")))

    这和Application.WorksheetFunction.Sum完全一样,只是它没有完全限定。 如果您的项目有一个WorksheetFunction类,或者在作用域中有一个WorksheetFunction对象variables,则只要parsing结果(可能导致编译错误),它将优先于完全限定的Application.WorksheetFunction调用。 否则,相同。


哪一个“更可靠”取决于你所认为的“可靠”。 我个人认为编译时解决scheme是完全值得的,所以“最可靠”将是完全合格的早期版本。