3

私は最近 VBIDE ライブラリについて知りましたが、まだすべての機能を把握していません。プロジェクトで見つかったクラスに基づいて正しいクラスをインスタンス化するメソッドを作成したいと考えています。インスタンス化する候補として適合するクラスImplement InterfaceA、およびインスタンス化する正確なクラスにはプロパティがMTypeあり、それが返されますEnumerated Value Correct

Correctしたがって、Propertyを返す Class を見つけてMType、その 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

ご覧のとおり、このプロパティは非常に単純で、常に同じ値を返すと想定しています。

更新: 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 メソッドを使用する必要があります。

特に注目すべきは、startlineendlinestartcol、および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

次に、別の場所で、プレーンな jane モジュールの sub を で呼び出しますApplication.Run

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

これで、最終的に dynamic のインスタンスを使用できるようになりました。

foo = dynamic.InterfaceA_MType()

私がリンクした質問を私の他の回答と一緒に注意深く読むと、解決策を見つけることができるはずです. 知っておくべきことはすべて、これら 2 つの答えの組み合わせにあります。

于 2015-05-18T17:22:19.920 に答える