【问题标题】:Iterate over Methods defined in a Module迭代模块中定义的方法
【发布时间】:2015-05-18 16:20:27
【问题描述】:

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

所以总结一下我如何迭代我的项目中定义的类,以便找到返回Correct 属性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 的观察部分答案位于here 我可以使用ProcBodyLine(InterfaceA_MType) 和ProcCountLines(InterfaceA_MType) 来遍历程序行,匹配那些行与具有IModel_MType = Correct 的行匹配。

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

【问题讨论】:

  • 如果您还没有看过 Chip Pearson 的网站,这里有您需要的信息:cpearson.com/excel/vbe.aspx
  • @DougGlancy 谢谢!我实际上在找到我的答案之前看到了这个,但在你提出之前错过了答案(部分)!我会根据我的发现更新问题。
  • this 和 this 可能重复。
  • @RubberDuck 感谢您的意见。我可能错过了一些东西,但我无法在这两个问题中找到任何可以解决我的问题的问题this 问题是最接近的,除了CallByName 要求您拥有一个已经实例化的对象。我现在的问题是如何首先实例化该对象。
  • 当心,即时编写和执行代码是使 VBE 崩溃的好方法...您知道 ;-)

标签: vba excel vbide


【解决方案1】:

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

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 method。

需要特别注意的是,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()

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

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2011-11-26
    • 2020-04-04
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多