2013-01-07 51 views
6

在Excel解析VBA模块功能参数,我有称为MyModule一个VBA模块,其具有作为这样经由反射

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

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

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

+1

'yourWorkbook.VBProject.VBComponents(“MyModule”)。CodeModule'应该可以让你访问你需要的东西。 – assylias

+0

@assylias这是给我的整个源代码,这不是很好,但可以帮助解决我的问题。你是否知道可以给我一个对象的功能(类似于C#或JavaScript)? – Adam

+0

我只将它作为评论发布,因为它缺少细节,但认为它会帮助您开始。我相信稍后有人会发布更好的答案。 – assylias

回答

6

有一个在这个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 

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

+0

也有可能以某种方式获得类模块实例的私有成员(如属性)? –