这是一个老问题,我知道,但为了正确起见:VBA 的 CallByName不接受字符串作为
“将在其上执行函数的对象的名称。”
在某些地方,MSDN 示例被歪曲成一个明显错误的示例。它必须是每个 si的对象。所以,而不是:
Call CallByName("itm", PAN_Source, VbGet)
去做:
Call CallByName(itm, "NameMethodThatUsesString_PAN_Source" , VbGet, PAN_Source)
PAN_Source 必须在可选的 Args() 中提供。
作为奖励,如果它以 Function (vbMethod) 的形式返回某些内容,请使用 Variant 接收它:
auxVar = CallByName (itm, "NameMethodThatUsesString_PAN_Source" , VbGet, PAN_Source)
我主要使用它在排序算法中通过 Property Get 或 Set 将某些 Collections 迭代到 SortIt() 或检索值 - 或两者兼而有之,例如:
...
If IsMissing(CallByNameArg0) Then
If VarType(CallByName(this, SortPropertyName, VbGet)) = vbObject Then
Set thisValue = CallByName(this, SortPropertyName, VbGet)
Else
thisValue = CallByName(this, SortPropertyName, VbGet)
End If
Else
If VarType(CallByName(this, SortPropertyName, VbGet)) = vbObject Then
Set thisValue = CallByName(this, SortPropertyName, VbGet, CallByNameArg0)
Else
thisValue = CallByName(this, SortPropertyName, VbGet, CallByNameArg0)
End If
End If
...
this
我们要回调的对象在哪里并且CallByNameArg0
是一个变体(允许IsMissing(CallByNameArg0 )
)
如果有人试图对标准模块使用 CallByName,它将不起作用;相反,请尝试Application.Run