CallByName不适用于所有对象/功能

时间:2020-04-07 19:34:39

标签: excel vba

在VBA中,大多数Excel函数可以通过Application.WorksheetFunctionVBA来访问

sinhsin为例:

工作表功能

Debug.Print Application.WorksheetFunction.sinh(5)
 74,2032105777888

VBA功能

Debug.Print VBA.sin(5)
-0,958924274663138

问题:

为什么CallByName在工作表功能和VBA功能上都不起作用?

工作表功能

Debug.Print CallByName(Application.WorksheetFunction, "sinh", VbGet, 5)
 74,2032105777888

VBA功能

Debug.Print CallByName(VBA, "sin", VbGet, 5)

enter image description here

2 个答案:

答案 0 :(得分:3)

在VBA中,大多数Excel函数都可以通过Application.WorksheetFunction或VBA访问

不。通过对全局Excel.Application对象的后期绑定成员调用(如果您托管在Excel中),可以访问Excel函数,然后其中一些具有早期绑定的“等效”(错误处理策略将有所不同)。 Excel.WorksheetObject界面(实际上是从Application.WorksheetFunction获得的。)

VBA库的成员(无论是否具有全局作用域)与Excel无关:每个VBA项目都引用VBA标准库,无论其宿主应用程序(Word,Excel,Access, ... SolidWorks,Sage300等)。如果某个函数看起来在VBA和Excel库中都存在,则应该/从理论上讲应该首选VBA函数。

使用对象浏览器(F2)查找VBA标准库的成员,尤其是其Math模块。

答案 1 :(得分:1)

CallByName ...的呼叫签名实际上是VBA.Interaction的成员,如下所示(因此您的代码段相当于VBA.Interaction.CallByName(VBA, "sin", VbGet, 5)或只是VBA.CallByName...,在不管怎么说)

enter image description here

CallByName(Object As Object, ProcName As String, CallType As VbCallType, Args() As Variant)

由于VBA不是Object,而是标准VBA库,因此会引发类型不匹配错误。