首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将参数数组传递给CallByName VBA

将参数数组传递给CallByName VBA
EN

Stack Overflow用户
提问于 2016-03-30 23:38:51
回答 2查看 2.5K关注 0票数 3

我正在使用callByName I VBA动态调用一个类的不同方法。根据方法的不同,我将拥有不同数量的参数,这些参数将保存在一个数组中。不幸的是,CallByName接受一个参数数组,因此传递变量number并不简单。有没有办法绕过这个问题,我找到了一个使用类型信息库的解决方案,但这似乎不适用于VBA,尽管我已经将其添加为一个引用。下面是我想要的说明

代码语言:javascript
复制
 Public Sub Initialize_Object(ByRef TaskObject, Task_Collection)

 Dim Task_begin As Variant, Method_Parameters As Variant

 Task_begin = Task_Collection("Method")

 CallByName TaskObject, Task_begin, VbMethod, Method_Parameters
EN

回答 2

Stack Overflow用户

发布于 2016-03-31 02:12:12

您可以通过更改方法签名将CallByName与数组一起用作参数:

代码语言:javascript
复制
#If VBA7 Or Win64 Then
  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
#Else
  Private Declare Function rtcCallByName Lib "VBE6.DLL" ( _
    ByVal Object As Object, _
    ByVal ProcName As Long, _
    ByVal CallType As VbCallType, _
    ByRef args() As Any, _
    Optional ByVal lcid As Long) As Variant
#End If

Public Function CallByName2(Object As Object, ProcName As String, args() As Variant)
   AssignResult CallByName2, 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

下面是一个使用示例:

代码语言:javascript
复制
Sub UsageExample()
  Dim obj As Object, arguments()

  Dim obj As New Class1
  arguments = Array(1, 3)

  CallByName2 obj, "MyMethod", arguments
End Sub
票数 7
EN

Stack Overflow用户

发布于 2016-03-31 00:14:40

您不能动态地这样做,因为不同的方法将需要不同数量的参数,并且您不能在不需要的地方传递参数。

如果您知道所需参数的数量,则可以调用数组的每一项并传递:

代码语言:javascript
复制
CallByName TaskObject, Task_begin, VbMethod, Method_Parameters(0), Method_Parameters(1), Method_Parameters(2)

但您可能必须设置一个Select Case块或类似的代码块来处理所有不同的方法:

代码语言:javascript
复制
Select Case Method_Name
    Case "Method_1": CallByName TaskObject, Task_begin, VbMethod, Method_Parameters(0), Method_Parameters(1)
    Case "Method_2": CallByName TaskObject, Task_begin, VbMethod, Method_Parameters(0)
    Case "Method_3": CallByName TaskObject, Task_begin, VbMethod, Method_Parameters(0), Method_Parameters(1), Method_Parameters(2)
End Select

很容易弄得一团糟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36313575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档