7

在 Excel 中,我有一个名为 VBA 的模块MyModule,它具有这样的功能

    Public Function MyFunction(Param1 As Range, Param2 As Range) As String
            ' some implementation
    End Function

在运行时,我知道我有一个模块被调用MyModule,我知道我有一个函数被调用MyFunction,但我想动态检查参数名称Param1Param2

在我的世界 (C#) 中,这称为反射。我可以在这里使用类似的概念来获取参数名称还是我对 VBA 的期望过高?

4

1 回答 1

7

这个 CodeProject http://www.codeproject.com/Articles/164036/Reflection-in-VBA-a-CreateObject-function-for-VBA有很好的分析

提炼:

VBA 不支持反射,这是一个具有许多方面的 OOP 概念,包括在设计时不知道其类型的情况下实例化类的能力。反射提供了极大的灵活性,这是 VBA 所缺乏的(至少对于我们这些喜欢将 VBA 用于超出其通常预期目的的人来说)。

有一些类似反射的事情是可能的:

例子

例如,如果我想创建 Excel 应用程序对象的实例,而不必在代码中显式声明类型(使用 Set xlApp = New Excel.Application),我可以使用以下反射级对象创建代码来实现:

Dim xlApp As Excel.Application 
Set xlApp = CreateObject(,"Excel.Application") 

这相当于类型特定的语句

Set xlApp = New Excel.Application

还:

您可以使用assylias方法来询问您自己的代码(使用正则表达式或其他一些解析来挑选您感兴趣的代码部分):

yourWorkbook.VBProject.VBComponents("MyModule").CodeModule

这篇文章中有一些有趣的线索:Iteration through the Object Browser in VBA

于 2013-03-19T13:04:07.567 回答