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

use*_*927 7 excel vba excel-vba vbide

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

谢谢!

Rub*_*uck 13

是的,但我不推荐它.VBA并不是真的为它而建.您已使用Excel标记了此问题,因此我将介绍如何为该Office产品执行此操作.一般概念适用于大多数Office套件,但每种不同的产品都具有不同的Application.Run方法语法.

首先,了解动态调用过程(子/函数)的两种不同方法以及何时使用每种方法非常重要.

Application.Run

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

第一个参数是过程的名称(以字符串形式传入).之后,您最多可以传递30个参数.(如果您的程序需要更多,请重构代码.)

还有另外两件需要注意的重要事项Application.Run.

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

    Public Sub Test1()
        Application.Run "VBAProject.Module1.SomeFunction"
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)

外卖:

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

VBA.Interaction.CallByName

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

它将您想要作为参数调用方法的对象的实例以及方法名称(再次作为字符串)接受.

Public Sub Test2()
    Dim anObj As SomeObject
    Dim result As Boolean

    result = CallByName(anObj, "IsValid")
End Sub
Run Code Online (Sandbox Code Playgroud)

外卖:

使用CallByName时要调用一个类的方法.

没有指针.

如您所见,这些方法都不使用实际指针(至少不是外部指针).它们接受字符串,然后使用它们来查找指向要执行的过程的指针.因此,您需要知道要执行的过程的确切名称.您还需要知道需要使用哪种方法.CallByName有额外的负担需要你想要调用的对象的实例.无论哪种方式,您都可以将这些名称存储为数组或集合中的字符串.(哎呀,即使是字典也是有道理的.)

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

文章和SE问题:

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

我的一些Q&As的代码:

  1. vbeCodeModule
  2. vbeProcedure
  3. vbeProcedures

  • 很好的答案.正是我在上面的评论中提到的,但是太忙/懒得继续扩展. (3认同)