迭代模块中定义的方法
Iterate over Methods defined in a Module
我最近发现了 VBIDE 库,但我还没有完全掌握它的所有功能。我想创建一个方法,根据我的项目中找到的 classes 实例化正确的 Class。 Class 适合作为要实例化的候选 Implement
InterfaceA
,而我想要实例化的确切 class 有 属性 MType
并且它returns Enumerated Value
Correct
.
所以总结一下我如何迭代我的项目中定义的 classes 以便找到 Class returns Correct
for 属性 MType
,并实例化 Class。
到目前为止,我知道我可以使用以下代码迭代我的模块:
Dim Part As VBComponent
For Each Part In Application.VBE.ActiveVBProject.VBComponents
Debug.Print Part.Name
Next Part
我现在缺少的是如何遍历每个 class 的 methods/properties 以找出这些方法 return?
这是我需要找到的方法,它的值从 class 到 class 不等 returns:
Public Property Get InterfaceA_MType() As Model_Types
IModel_MType = Severity
End Property
正如您所见,这个 属性 非常简单,我假设它将一直 return 相同的值。
更新:Per Dough Gancy 的观察部分答案位于 here
我可以使用 ProcBodyLine(InterfaceA_MType)
和 ProcCountLines(InterfaceA_MType)
遍历过程行,匹配具有 IModel_MType = Correct
的行 。
这只省略了基于代码模块的 Class 实例化。我该怎么做?
首先,这不会迭代您的 classes,它会迭代您文件中的所有模块。
Dim Part As VBComponent
For Each Part In Application.VBE.ActiveVBProject.VBComponents
Debug.Print Part.Name
Next Part
如果您只想迭代 class 模块,则需要检查组件类型。
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 of the 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
最后,为了创建一个 class 的实例,它必须是一个全局实例...哪种气味,但无论如何。你还没有真正给我们你的最终目标。我觉得通过一些好的 OOP 编程可以更好地解决你的问题,但这不是你问的问题。
要使用 class 的实例,您需要 dynamically create a module and procedure 实例化 class 的实例。甚至可能即时重写调用代码。
因此,在这个动态生成的模块中,您需要编写如下内容。
Public dynamic As ClassType
Public Sub InitalizeDynamic()
Set dynamic = new ClassType
End Sub
然后,在其他地方,您会 。
Public Sub Test1()
Application.Run "VBAProject.Module1.IntializeDynamic"
End Sub
所以,你终于可以使用动态的实例了。
foo = dynamic.InterfaceA_MType()
如果您仔细阅读我链接到我的其他答案的问题,您应该能够找到解决方案。您需要知道的一切都在这两个答案的组合中。
我最近发现了 VBIDE 库,但我还没有完全掌握它的所有功能。我想创建一个方法,根据我的项目中找到的 classes 实例化正确的 Class。 Class 适合作为要实例化的候选 Implement
InterfaceA
,而我想要实例化的确切 class 有 属性 MType
并且它returns Enumerated Value
Correct
.
所以总结一下我如何迭代我的项目中定义的 classes 以便找到 Class returns Correct
for 属性 MType
,并实例化 Class。
到目前为止,我知道我可以使用以下代码迭代我的模块:
Dim Part As VBComponent
For Each Part In Application.VBE.ActiveVBProject.VBComponents
Debug.Print Part.Name
Next Part
我现在缺少的是如何遍历每个 class 的 methods/properties 以找出这些方法 return?
这是我需要找到的方法,它的值从 class 到 class 不等 returns:
Public Property Get InterfaceA_MType() As Model_Types
IModel_MType = Severity
End Property
正如您所见,这个 属性 非常简单,我假设它将一直 return 相同的值。
更新:Per Dough Gancy 的观察部分答案位于 here
我可以使用 ProcBodyLine(InterfaceA_MType)
和 ProcCountLines(InterfaceA_MType)
遍历过程行,匹配具有 IModel_MType = Correct
的行 。
这只省略了基于代码模块的 Class 实例化。我该怎么做?
首先,这不会迭代您的 classes,它会迭代您文件中的所有模块。
Dim Part As VBComponent For Each Part In Application.VBE.ActiveVBProject.VBComponents Debug.Print Part.Name Next Part
如果您只想迭代 class 模块,则需要检查组件类型。
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 of the 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
最后,为了创建一个 class 的实例,它必须是一个全局实例...哪种气味,但无论如何。你还没有真正给我们你的最终目标。我觉得通过一些好的 OOP 编程可以更好地解决你的问题,但这不是你问的问题。
要使用 class 的实例,您需要 dynamically create a module and procedure 实例化 class 的实例。甚至可能即时重写调用代码。
因此,在这个动态生成的模块中,您需要编写如下内容。
Public dynamic As ClassType
Public Sub InitalizeDynamic()
Set dynamic = new ClassType
End Sub
然后,在其他地方,您会
Public Sub Test1()
Application.Run "VBAProject.Module1.IntializeDynamic"
End Sub
所以,你终于可以使用动态的实例了。
foo = dynamic.InterfaceA_MType()
如果您仔细阅读我链接到我的其他答案的问题,您应该能够找到解决方案。您需要知道的一切都在这两个答案的组合中。