迭代模块中定义的方法

时间:2015-05-18 16:20:27

标签: vba excel-vba vbide excel

我最近发现了VBIDE库,但我还没有完全掌握它的所有功能。我想创建一个方法,根据我的Project中找到的类来实例化正确的Class。适合作为候选者进行实例化的类Implement InterfaceA,以及我要实例化的确切类具有属性MType,并返回Enumerated Value Correct。< / p>

因此,为了找到对于Property Correct返回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的观察部分答案位于here 我可以使用ProcBodyLine(InterfaceA_MType)ProcCountLines(InterfaceA_MType)迭代过程行,匹配那些具有IModel_MType = Correct的行。

这样就不会根据代码模块实例化Class。我该怎么做?

1 个答案:

答案 0 :(得分:2)

首先,这不会迭代您的类,它会迭代文件中的所有模块。

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

现在,要在代码模块中找到任何特定方法,您需要使用Find method对象的CodeModule

特别值得注意的是,startlineendlinestartcolendcol都是passed by reference and are effectively "out" parameters

因此,该代码看起来像这样。

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编程可以更好地解决您的问题,但这不是您提出的问题。

要获取要使用的类的实例,您需要dynamically create a module and procedure来实例化该类的实例。甚至可能即时重写呼叫代码。

因此,在这个动态生成的模块中,您需要编写类似的内容。

Public dynamic As ClassType

Public Sub InitalizeDynamic()
     Set dynamic = new ClassType
End Sub

然后,在其他地方,你会call the plain jane module sub with Application.Run

Public Sub Test1()
    Application.Run "VBAProject.Module1.IntializeDynamic"
End Sub

所以,最后你可以使用动态实例。

foo = dynamic.InterfaceA_MType()

如果您仔细阅读我与其他答案相关的问题,您应该能够找到解决方案。你需要知道的一切都是这两个答案的组合。