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

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

谢谢!

是的,但我不推荐它。 VBA是不是真的为它build立。 你已经用Excel标记了这个问题,所以我将描述它是如何完成该Office产品的。 一般概念适用于大多数Office套件,但是每种不同的产品对于Application.Run方法都有不同的语法。

首先,了解dynamic调用过程(子/函数)的两种不同方法以及何时使用它们是非常重要的。

Application.Run

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

第一个参数是过程的名称(作为string传入)。 之后,你可以传递30个参数。 (如果你的程序需要更多的话,那么重构代码的爱 )。

还有两件重要的事情要注意Application.Run

  1. 你不能使用命名参数。 参数必须按位置传递。
  2. 作为parameter passing的对象被转换为值。 这意味着如果您尝试运行需要具有默认属性作为参数的对象的过程,则可能会遇到意外的问题。

     Public Sub Test1() Application.Run "VBAProject.Module1.SomeFunction" End Sub 

外卖:

在使用标准模块时使用Application.Run。

VBA.Interaction.CallByName

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

它将要调用该方法的对象的实例作为参数以及方法名称(再次作为string)。

 Public Sub Test2() Dim anObj As SomeObject Dim result As Boolean result = CallByName(anObj, "IsValid") End Sub 

外卖:

当你想调用一个类的方法时使用CallByName

没有指针。

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

因此,您可以将它们硬编码为string,或者尝试在运行时提取适当的过程名称。 为了提取过程名称,您需要通过Microsoft Visual Basic for Applications扩展性库与VBIDE本身进行交互。 在这里解释所有这些将需要太多的代码和努力,但我可以指出一些好的资源。

文章和SE问题:

  1. Chip Pearson编程的VBA编辑器
  2. 扩展VBA可扩展性库
  3. 丑陋的解决方法,以获得vbext_ProcKind正在打破封装
  4. VBA的Automagictesting框架
  5. 如何在运行时获取过程或函数名称
  6. 导入代码行
  7. VBA中的元编程:VBIDE和为什么文档很重要

我的一些Q&A的代码:

  1. vbeCodeModule
  2. vbeProcedure
  3. vbeProcedures