3

我最近发现了 VBIDE 库,但我还没有完全掌握它的所有功能。我想创建一个方法,该方法将根据在我的项目中找到的类实例化正确的类。适合作为候选实例化Implement InterfaceA的类,并且我要实例化的确切类具有属性MType并返回Enumerated Value Correct

因此,总结一下我如何迭代我的项目中定义的类,以便找到 Correct为 Property返回的类MType,并实例化该类。

到目前为止,我知道我可以使用以下代码迭代我的模块:

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.

这仅省略了基于代码模块实例化类。我怎么做?

4

1 回答 1

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

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

特别值得注意的是startlineendline, 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.

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

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

foo = dynamic.InterfaceA_MType()

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

于 2015-05-18T17:22:19.920 回答