40 モジュールからプロシージャの宣言行をリストアップする

1つのモジュールのコードを「CodeModule」オブジェクトとして取り出し、「Lines」プロパティで各行のコードを取り出すループにおいて、取り出した1行内を文字列処理で検索することによって、特定の文字列を持っている行だけをリストアップすることができます。その特定の文字列を”プロシージャの宣言行”にあるキーワードとすることで、プロシージャの宣言行をリストアップすることができます。

下記プログラムでは、そのキーワードを『Sub』、『Function』、『Private Sub』、『Private Function』、『Public Sub』、『Public Function』の6つとし(クラスモジュールも含めるとこの限りではありません)、そのいずれかでコードが始まっている行をプロシージャの宣言行と判定しています。
それらはIf〜ElseIf文で分岐してもかまいませんが、ここでキーワードをあらかじめ配列に代入しておき、配列内のループによって6つの判定を行っています。
プログラム

Sub SampleCode_40()
'モジュールからプロシージャの宣言行をリストアップする

  Dim vbcmp As Object
  Dim intRow As Integer
  Dim strCode As String
  Dim avarSearch As Variant
  Dim iintLoop As Integer

  'プロシージャの宣言行と判定する先頭文字列の配列を設定
  avarSearch = Array("Sub", "Function", "Private Sub", "Private Function", _
                      "Public Sub", "Public Function")

  'VBEのすべてのモジュールのループ
  For Each vbcmp In VBE.ActiveVBProject.VBComponents
    With vbcmp
      '1モジュール内のすべてのコードを取り出すループ
      For intRow = 1 To .CodeModule.CountOfLines
        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

実行例
■実行後
| Index | Prev | Next |



Copyright © T'sWare All rights reserved