在C / C ++中,当我有一堆函数(指针)时,我可以将它们存储在数组或向量中,并按特定顺序将它们中的一些调用。在VBA中可以做类似的事情吗?
谢谢!
答案 0 :(得分:11)
是的,但我不推荐它。 VBA并不是真的为它而建。您已使用Excel标记了此问题,因此我将介绍如何为该Office产品执行此操作。一般概念适用于大多数Office套件,但每种不同的产品对Application.Run
方法的语法不同。
首先,了解动态调用过程(子/函数)的两种不同方法以及何时使用每种方法非常重要。
Application.Run
将运行子例程或调用存储在标准*.bas
模块中的函数。
第一个参数是过程的名称(以字符串形式传入)。之后,您最多可以传递30个参数。 (如果您的程序需要更多,重构代码的爱。)
关于Application.Run
还有另外两个需要注意的重要事项。
作为参数传递的对象将转换为值。这意味着如果您尝试运行需要具有默认属性作为参数的对象的过程,则可能会遇到意外问题。
Public Sub Test1()
Application.Run "VBAProject.Module1.SomeFunction"
End Sub
在使用标准模块时使用Application.Run。
CallByName
执行对象的方法,或设置/获取对象的属性。
它将要作为参数调用方法的对象的实例以及方法名称(再次作为字符串)接受。
Public Sub Test2()
Dim anObj As SomeObject
Dim result As Boolean
result = CallByName(anObj, "IsValid")
End Sub
如果要调用类的方法,请使用CallByName
。
正如您所看到的,这些方法都不使用实际指针(至少不是外部指针)。它们接受字符串,然后使用它们来查找指向要执行的过程的指针。因此,您需要知道要执行的过程的 确切 名称。您还需要知道需要使用哪种方法。 CallByName
有额外的负担需要您要调用的对象的实例。无论哪种方式,您都可以将这些名称存储为数组或集合中的字符串。 (哎呀,即使字典也有意义。)
因此,您可以将这些硬编码为字符串,或尝试在运行时提取相应的过程名称。为了提取过程名称,您需要通过Microsoft Visual Basic for Applications Extensibility库与VBIDE本身连接。在这里解释所有这些将需要太多的代码和努力,但我可以指出一些好的资源。
文章& SE问题:
我的一些Q&为:强>
答案 1 :(得分:0)
一种解决方法是枚举并使用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"