[英]Iterate over Methods defined in a Module
我最近發現了VBIDE庫,但我還沒有完全掌握它的所有功能。 我想創建一個方法,根據我的Project中找到的類來實例化正確的Class。 適合作為實例化候選者的類Implement
InterfaceA
,我想要實例化的確切類具有屬性MType
,並返回Enumerated Value
Correct
。
因此,為了找到我的項目中定義的類,以便找到返回Correct
for Property MType
Class,並實例化該Class,我要總結一下。
到目前為止,我知道我可以使用以下代碼迭代我的模塊:
Dim Part As VBComponent
For Each Part In Application.VBE.ActiveVBProject.VBComponents
Debug.Print Part.Name
Next Part
我現在缺少的是如何迭代每個類的方法/屬性以找出這些方法返回的內容?
這是我需要找到的方法,它因類返回而不同:
Public Property Get InterfaceA_MType() As Model_Types
IModel_MType = Severity
End Property
所以你可以看到這個屬性非常簡單我假設它將一直返回相同的值。
更新:Per Dough Gancy的觀察部分答案位於此處我可以使用ProcBodyLine(InterfaceA_MType)
和ProcCountLines(InterfaceA_MType)
迭代過程行,匹配那些具有IModel_MType = Correct
。
這樣就不會基於代碼模塊實例化類。 我怎么做?
首先,這不會迭代您的類,它會迭代文件中的所有模塊。
Dim Part As VBComponent For Each Part In Application.VBE.ActiveVBProject.VBComponents Debug.Print Part.Name Next Part
如果要迭代只有類模塊,則需要檢查組件類型。
Dim Part As VBComponent
For Each Part In Application.VBE.ActiveVBProject.VBComponents
If Part.Type = vbext_ct_ClassModule Then
Debug.Print Part.Name
End If
End If
現在,要在代碼模塊中查找任何特定方法,您需要使用CodeModule對象的Find方法 。
需要特別注意的,是一個事實,即startline
, endline
, startcol
和endcol
都按引用傳遞,並有效地“走出去”的參數 。
所以,代碼看起來像這樣。
Dim startLine As Long
Dim endLine As Long
Dim startCol As Long
Dim endCol As Long
startLine = 1
startCol = 1
endLine = -1
endCol = -1
If Part.Find("Public Property Get InterfaceA_MType()", startLine, startCol, endLine, endCol) Then
' do something
End If
最后,為了創建一個類的實例,它必然是一個全局實例......哪種氣味,但無論如何。 你沒有真正給我們你的最終目標。 我有一種感覺,通過一些優秀的OOP編程可以更好地解決您的問題,但這不是您提出的問題。
要獲取要使用的類的實例,您需要動態創建一個實例化該類實例的模塊和過程 。 甚至可能即時重寫調用代碼。
因此,在這個動態生成的模塊中,您需要編寫類似這樣的內容。
Public dynamic As ClassType
Public Sub InitalizeDynamic()
Set dynamic = new ClassType
End Sub
然后,在其他地方,您將使用Application.Run
調用plain jane模塊子 。
Public Sub Test1()
Application.Run "VBAProject.Module1.IntializeDynamic"
End Sub
所以,最后你可以使用動態的實例。
foo = dynamic.InterfaceA_MType()
如果你仔細閱讀我鏈接的問題和我的其他答案,你應該能夠找到解決方案。 您需要知道的一切都是這兩個答案的組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.