我最近发现了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。我该怎么做?
答案 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。
特别值得注意的是,startline
,endline
,startcol
和endcol
都是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()
如果您仔细阅读我与其他答案相关的问题,您应该能够找到解决方案。你需要知道的一切都是这两个答案的组合。