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

时间:2015-03-05 05:11:08

标签: excel vba excel-vba vbide

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

谢谢!

2 个答案:

答案 0 :(得分:11)

是的,但我不推荐它。 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
    
  3. 外卖:

    在使用标准模块时使用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问题:

    1. Chip Pearson's Programming The VBA Editor
    2. Extending the VBA Extensibility Library
    3. Ugly workaround to get the vbext_ProcKind is breaking encapsulation
    4. Automagic testing framework for VBA
    5. How to get the procedure or function name at runtime
    6. Import Lines of Code
    7. Meta Programming in VBA: The VBIDE and Why Documentation is Important
    8. 我的一些Q&为:

      1. vbeCodeModule
      2. vbeProcedure
      3. vbeProcedures

答案 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"