dwi*_*ony 2 excel vba excel-vba
所以有一天我得到了一些奇怪的总和值,我完全被难倒了.我放弃在VBA中使用sum函数,只是添加了很长的值(通过循环),但后来我在某处读到使用VBA中的sum函数对于开发人员来说并不总是可靠的?(我找不到帖子了,但我还在寻找它).
有没有道理呢?我知道很多人有不同的方法可以从一系列细胞中获得总和 - 而不是过于自以为是,哪一个会返回最准确的结果?
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
Run Code Online (Sandbox Code Playgroud)
我正在努力重现我的错误 - 基本上当循环通过许多行(15,000+)并获得总和时,有些人会返回零,而不应该这样.
Application.Sum(Range(("A1"), ("Z1")))
这是一个迟到的号召Excel.Application
,在运行时解决; 与任何后期绑定调用(例如,反对Object
或Variant
)一样,您不会获得任何智能感知,无自动完成,也无需编译时验证,无论是名称中的拼写错误还是订单或参数数量.如果调用无效或函数否则导致错误,这将返回一个Error
可以使用IsError
VBA函数验证的值(当然,如果函数名中有拼写错误,您将得到的是运行时错误# 438"对象不支持此属性或方法").
使这种语法有效的原因是Excel.Application
COM接口有一个标志,使其可扩展 - 我不确定它是否通过直接WorksheetFunction
接口扩展,或者它是否只是使成员加倍,但无论如何,这是正在发生的事情:你是Application
在编译时调用接口上不存在的成员.
Application.WorksheetFunction.Sum(Range(("A1"), ("Z1")))
这是一个早期绑定的调用Excel.WorksheetFunction
,在编译时解决; 您将获得IntelliSense,自动完成和编译时验证.输入错误将无法编译,因为缺少必需的参数.如果调用无效或函数导致错误,则会引发 VBA运行时错误,您可以On Error
使用标准的VBA惯用错误处理语句处理该错误.
WorksheetFunction.Sum(Range(("A1"), ("Z1")))
这完全一样Application.WorksheetFunction.Sum
,除了它不完全合格.如果您的项目有一个WorksheetFunction
类,或者WorksheetFunction
范围内有一个对象变量,那么就Application.WorksheetFunction
解决方案而言,它将优先于完全限定的调用(这可能导致编译错误).否则,相同.
哪一个"更可靠"取决于您认为"可靠"的确切含义.我个人认为编译时解析完全值得,所以"最可靠"将是完全合格的早期版本.
归档时间: |
|
查看次数: |
58 次 |
最近记录: |