1つのモジュールのコードを「CodeModule」オブジェクトとして取り出し、「Lines」プロパティで各行のコードを取り出すループにおいて、上限をCountOfLinesプロパティではなく「CountOfDeclarationLines」プロパティの値とすることで、Declarationsセクションのコードだけを取り出すことができます(※注)。CountOfDeclarationLinesプロパティにはDeclarationsセクション内のコー
ドの総行数が格納されています。
また、Linesプロパティで取り出した1行について、特定の文字列、ここでは変数の宣言を表す『Dim』、『Public』、『Private』のいずれかで始まっているかどうかを判定することで、変数の宣言行だけをリストアップすることができます。
- CountOfLinesプロパティは”モジュール”の全行数、CountOfDeclarationLinesプロパティは”Declarations”の行数です。Linesプロパティでの行番号指定は同じです。同じ行番号を指定すれば同じコードが取り出されます。あくまでもループの上限が違うだけです。
プログラム
Sub SampleCode_41()
'Declarationsセクションの変数の宣言行をリストアップする
Dim vbcmp As Object
Dim intRow As Integer
Dim strCode As String
Dim avarSearch As Variant
Dim iintLoop As Integer
'変数の宣言行と判定する先頭文字列の配列を設定
avarSearch = Array("Dim", "Public", "Private")
'VBEのすべてのモジュールのループ
For Each vbcmp In VBE.ActiveVBProject.VBComponents
With vbcmp
'Declarationsセクション内のすべてのコードを取り出すループ
For intRow = 1 To .CodeModule.CountOfDeclarationLines
strCode = .CodeModule.Lines(intRow, 1)
'1行のコード内から変数の宣言行かどうか判定するループ(配列を1つずつチェック)
For iintLoop = 0 To UBound(avarSearch)
If LTrim(strCode) Like avarSearch(iintLoop) & "*" Then
'コードが所定の先頭文字列で始まっていたらイミディエイトウィンドウに出力
Debug.Print .Name & "(" & intRow & "): " & strCode
'それ以上は配列の確認はせずに次の行へ
Exit For
End If
Next iintLoop
Next intRow
End With
Next vbcmp
End Sub
実行例
■実行後
|