作者:D之phper | 来源:互联网 | 2023-05-19 13:08
在C/C++中,当我有一堆函数(指针)时,我可以将它们存储在数组或向量中,并按特定顺序将它们中的一些调用在一起.可以在VBA中做类似的事情吗?
谢谢!
1> RubberDuck..:
是的,但我不推荐它.VBA并不是真的为它而建.您已使用Excel标记了此问题,因此我将介绍如何为该Office产品执行此操作.一般概念适用于大多数Office套件,但每种不同的产品都具有不同的Application.Run
方法语法.
首先,了解动态调用过程(子/函数)的两种不同方法以及何时使用每种方法非常重要.
Application.Run
Application.Run
将运行子程序或调用存储在标准*.bas
模块中的函数.
第一个参数是过程的名称(以字符串形式传入).之后,您最多可以传递30个参数.(如果您的程序需要更多,请重构代码.)
还有另外两件需要注意的重要事项Application.Run
.
您不能使用命名参数.Args必须按位置传递.
作为参数传递的对象将转换为值.这意味着如果您尝试运行需要具有默认属性作为参数的对象的过程,则可能会遇到意外问题.
Public Sub Test1()
Application.Run "VBAProject.Module1.SomeFunction"
End Sub
外卖:
在使用标准模块时使用Application.Run.
VBA.Interaction.CallByName
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问题:
Chip Pearson的编程VBA编辑器
扩展VBA可扩展性库
获取vbext_ProcKind的丑陋解决方法正在打破封装
VBA的自动化测试框架
如何在运行时获取过程或函数名称
导入代码行
VBA中的元编程:VBIDE和为什么文档很重要
我的一些Q&As的代码:
vbeCodeModule
vbeProcedure
vbeProcedures
很好的答案.正是我在上面的评论中提到的,但是太忙/懒得继续扩展.