Excel VBA存储数组中的函数或子例程
在C / C ++中,当我有一堆函数(指针)时,我可以将它们存储在一个数组或向量中,并按照一定的顺序调用它们中的一些。 在VBA中可以做类似的事吗?
谢谢!
是的,但我不推荐它。 VBA是不是真的为它build立。 你已经用Excel标记了这个问题,所以我将描述它是如何完成该Office产品的。 一般概念适用于大多数Office套件,但是每种不同的产品对于Application.Run
方法都有不同的语法。
首先,了解dynamic调用过程(子/函数)的两种不同方法以及何时使用它们是非常重要的。
Application.Run
Application.Run
将运行子程序或调用存储在标准*.bas
模块中的函数。
第一个参数是过程的名称(作为string传入)。 之后,你可以传递30个参数。 (如果你的程序需要更多的话,那么重构代码的爱 )。
还有两件重要的事情要注意Application.Run
。
- 你不能使用命名参数。 参数必须按位置传递。
-
作为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问题:
- Chip Pearson编程的VBA编辑器
- 扩展VBA可扩展性库
- 丑陋的解决方法,以获得vbext_ProcKind正在打破封装
- VBA的Automagictesting框架
- 如何在运行时获取过程或函数名称
- 导入代码行
- VBA中的元编程:VBIDE和为什么文档很重要
我的一些Q&A的代码:
- vbeCodeModule
- vbeProcedure
- vbeProcedures