在Excel中,我有一个VBA模块MyModule,它具有这样的功能
Public Function MyFunction(Param1 As Range, Param2 As Range) As String
' some implementation
End Function
Run Code Online (Sandbox Code Playgroud)
在运行时,我知道我有一个调用的模块MyModule,我知道我有一个函数调用,MyFunction但我想动态检查参数名称Param1和Param2
在我的世界(C#)中,这称为反射.我可以在这里使用类似的概念来获取参数名称,还是我对VBA的期望过高?
这个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")
Run Code Online (Sandbox Code Playgroud)
这相当于特定于类型的语句
Set xlApp = New Excel.Application
Run Code Online (Sandbox Code Playgroud)
也:
您可以使用assylias方法来询问自己的代码(使用正则表达式或其他一些分析挑选出你的代码,你有兴趣的部分):
yourWorkbook.VBProject.VBComponents("MyModule").CodeModule
Run Code Online (Sandbox Code Playgroud)
这篇文章中有一些有趣的线索:在VBA中通过对象浏览器进行迭代