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