Excel VBA将函数或子例程存储在数组中

Excel VBA将函数或子例程存储在数组中,vba,excel,vbide,Vba,Excel,Vbide,在C/C++中,当我有一组函数(指针)时,我可以将它们存储在数组或向量中,并按一定顺序调用其中的一些函数。在VBA中可以做类似的事情吗 谢谢 是的,但我不推荐。VBA并不是为它而构建的。您已经用Excel标记了此问题,因此我将描述如何为该Office产品完成此操作。一般的概念适用于大多数Office套件,但是每个不同的产品对于应用程序.Run方法都有不同的语法 首先,了解动态调用过程(子/函数)的两种不同方法以及何时使用它们很重要 应用程序。运行 将运行子例程或调用存储在标准*.bas模块中的函

在C/C++中,当我有一组函数(指针)时,我可以将它们存储在数组或向量中,并按一定顺序调用其中的一些函数。在VBA中可以做类似的事情吗


谢谢

是的,但我不推荐。VBA并不是为它而构建的。您已经用Excel标记了此问题,因此我将描述如何为该Office产品完成此操作。一般的概念适用于大多数Office套件,但是每个不同的产品对于
应用程序.Run
方法都有不同的语法

首先,了解动态调用过程(子/函数)的两种不同方法以及何时使用它们很重要

应用程序。运行 将运行子例程或调用存储在标准
*.bas
模块中的函数

第一个参数是过程的名称(作为字符串传入)。之后,最多可以传递30个参数。(如果您的过程需要的不仅仅是这些,那么出于对代码的热爱进行重构。)

关于
应用程序,还有两件重要的事情需要注意

  • 不能使用命名参数。Args必须按位置传递
  • 作为参数传递的对象将转换为值。这意味着,如果您试图运行一个需要将具有默认属性的对象作为参数的过程,可能会遇到意外问题

    Public Sub Test1()
        Application.Run "VBAProject.Module1.SomeFunction"
    End Sub
    
  • 外卖: 使用应用程序。在使用标准模块时运行

    VBA.Interaction.CallByName 执行对象的方法,或设置/获取对象的属性

    它将要调用方法的对象的实例作为参数,以及方法名称(同样作为字符串)

    外卖: 要调用类的方法时,请使用
    CallByName

    没有指针。 如您所见,这两种方法都不使用实际指针(至少不在外部)。它们接受字符串,然后使用这些字符串查找指向要执行的过程的指针。因此,您需要知道要执行的过程的确切名称。您还需要知道需要使用哪种方法
    CallByName
    有额外的负担,需要调用对象的实例。无论哪种方式,都可以将这些名称作为字符串存储在数组或集合中。(见鬼,即使是一本字典也有道理。)

    因此,您可以将它们硬编码为字符串,或者尝试在运行时提取适当的过程名称。为了提取过程名称,您需要通过库与VBIDE本身进行接口。在这里解释这一切需要太多的代码和精力,但我可以向您指出一些好的参考资料

    文章和SE问题:

  • 我的一些Q&A中的代码:


  • 解决方法是枚举并使用switch语句。可以将枚举类型(long)存储在数组中。例如:

    Enum FType
        func1
        func2
        func3
    End Enum
    
    Sub CallEnumFunc(f As FType, arg As String)
        Select Case f
            Case func1: MyFunction1(arg)
            Case func2: MyFunction2(arg)
            Case func3: MyFunction3(arg)
        End Select
    End Sub
    
    Dim fArray(1) As FType
    fArray(0) = func1
    fArray(1) = func2
    CallEnumFunc fArray(1), "blah"
    

    我认为这在VBA中是不可能的。如果您尝试这样做,您将得到一个编译错误。@JLILIAman绝对有可能,只是OP不习惯。嗯,“这取决于”。VBA中的问题不在于存储指针,而是首先获取指针,然后再使用它们。然而,根据上下文的不同,有各种模糊的方法来做类似的事情。所以“你想做什么,为什么?”鲁伯杜克给我看一张照片example@JLILIAman检查下面我的答案。我有这类问题的历史。回答得很好。正是我在上面的评论中提到的,但太忙/懒散,无法继续。谢谢@rbaryyoung。我显然有过这种特殊问题的经历-
    Enum FType
        func1
        func2
        func3
    End Enum
    
    Sub CallEnumFunc(f As FType, arg As String)
        Select Case f
            Case func1: MyFunction1(arg)
            Case func2: MyFunction2(arg)
            Case func3: MyFunction3(arg)
        End Select
    End Sub
    
    Dim fArray(1) As FType
    fArray(0) = func1
    fArray(1) = func2
    CallEnumFunc fArray(1), "blah"