我目前正在使用 CallByName 来动态调用方法。我每天从服务器中的表格中获取几种方法以及参数。出于这个原因,我将参数数组发送给 CallByName 而不是参数数组,因为直到运行时我才知道参数的数量。鉴于 CallByName 需要一个参数数组,我使用私有声明函数来绕过 VBA 类型定义。
Private Declare PtrSafe Function rtcCallByName Lib "VBE7.DLL" ( _
ByVal Object As Object, _
ByVal ProcName As LongPtr, _
ByVal CallType As VbCallType, _
ByRef Args() As Any, _
Optional ByVal lcid As Long) As Variant
Public Function CallByNameMethod(Object As Object, ProcName As String, ByRef Args () As Variant)
AssignResult CallByNameMethod, rtcCallByName(Object, StrPtr(ProcName), VbMethod, Args)
End Function
Private Sub AssignResult(target, Result)
If VBA.IsObject(Result) Then Set target = Result Else target = Result
End Sub
当我传递一个方法更改其基础属性的对象时,这将起作用。但是,有一些方法我传递一个对象和一个改变传递参数值的方法。例如,我传递一个带有以下参数的数组
Dim Name as String, Value1 as double, Value2 as double, Value3 as double
Dim Array(3) as Variant
String = "Name"
Value1 = 0
Value2 = 0
Value3 = 0
Array(0) = Name
Array(1) = Value1
Array(2) = Value2
Array(3) = Value3
当我传递该数组时,该方法只返回具有相同值的数组,但我期望 Array(1)、Array(2)、Array(3) 的 double 类型值。有任何想法吗?