簡體   English   中英

迭代模塊中定義的方法

[英]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方法

需要特別注意的,是一個事實,即startlineendlinestartcolendcol按引用傳遞,並有效地“走出去”的參數

所以,代碼看起來像這樣。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM