2013-01-07 55 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

也有可能以某種方式獲得類模塊實例的私有成員(如屬性)? –