#04 モジュールのプロシージャをリストアップ

T'sKitの「オブジェクトツリー表示」ツールでは、モジュール名をクリックすることによってその中のプロシージャ一覧を表示するようになっています。ここではその方法について説明したいと思います。
 
ジュールの中を調べるにはまず「Moduleオブジェクト」を設定しますが、そのためにはまずフォーム、レポートあるいはモジュールを開いておく必要があります。ここでフォーム・レポートについてはデザインモードでも構いませんし、またそれらのクラスモジュールのウィンドウまで開く必要はありません。 

まず対象となるそれらのオブジェクトを開きます。続いてそれらのオブジェクト内のModuleオブジェクトをModuleオブジェクト変数にセットします。例えば次のようなコードになります。


  Dim mdl As Module

  DoCmd.OpenForm "frmMain", acDesign
  Set mdl = Forms!frmMain.Module

  DoCmd.OpenModule "modMain" 
  Set mdl = Modules!modMain

後は、変数 "mdl" のプロパティなどを操作することによってプロシージャ一覧の取得などの処理を行うことになるわけですが、プロシージャ一覧の場合はプロパティやコレクションなどによって直接的に得ることができません。そこで回り道しますが、Moduleオブジェクトのいくつかのプロパティを使いながら1つずつ手順を追って説明していきたいと思います。
ずモジュール内に記述されているすべてのコードをデバッグウィンドウに表示してみましょう。

モジュールの1行目から最終行までのループを構成し、1行ずつコードを取り出してデバッグウィンドウに出力します。そのためには次のModuleオブジェクトのプロパティを使います。

  • CountOfLines プロパティ
    空白行も含めたモジュールの全コード行数を返します。
  • Lines プロパティ
    指定行のコードの内容を示す文字列を返します。

それでは実際に次のコードを実行してみましょう。

  Dim lngRowCount As Long
  Dim iintLoop As Integer

  lngRowCount = mdl.CountOfLines

  For iintLoop = 1 To lngRowCount
    'iintLoop行目の1行分のコードを取得します
    Debug.Print mdl.Lines(iintLoop, 1)
  Next iintLoop
Moduleオブジェクトのプロパティのうち、"プロシージャ"に関するものとして次のプロパティがあります。
  • ProcOfLine プロパティ
    指定行が属するプロシージャ名を返します。 

これを先ほどのループの中に加えて見てください。なお、変数 lngProcKind にはその行が属する、SubプロシージャやProperty Letプロシージャなどのプロシージャの種類が返されます。ここではそれを使うことはありませんが、引数としては指定しておく必要があります。


  Dim lngProcKind As Long

  For iintLoop = 1 To lngRowCount
    Debug.Print mdl.Lines(iintLoop, 1);"--->"
    'iintLoop行目のコードが属する
    プロシージャ名を取得します

    Debug.Print mdl.ProcOfLine(iintLoop, lngProcKind)
  Next iintLoop

これによって、モジュール内のすべての行がそれぞれどのプロシージャに属していくかを取得することができました。
れではいよいよモジュール内のプロシージャをリストアップしてみましょう。 

考え方としては、まずプロシージャ名を入れる配列を用意しておき、[ProcOfLine]プロパティによって得られたプロシージャ名を順番にセットしていきます。もちろん、[ProcOfLine]プロパティからは同じプロシージャ名がいくつも返されますので、各行の属するプロシージャ名が取得されたら直前の行のプロシージャ名と比較して、同じ名前でなければ配列の最後尾にそれを追加するようにします。そして最後に配列の添え字の先頭から最後までをループで出力すればプロシージャ一覧が得られるというわけです。それでは実際に次のコードを実行して見てください。 

  Dim intProcNum As Integer
  Dim astrProcName() As String
  Dim strProcName As String
 
  'プロシージャ数のカウンタを初期化します
  intProcNum = 0

  'プロシージャ名の初期値をセットします
  strProcName = ""
  lngRowCount = mdl.CountOfLines
  For iintLoop = 1 To lngRowCount
    'strProcName変数とその行の属する
    プロシージャ名を比較します

    If strProcName <> mdl.ProcOfLine(iintLoop, lngProcKind) Then
      '新たなプロシージャ名なら
      strProcName = mdl.ProcOfLine(iintLoop, lngProcKind)
      'プロシージャ数のカウンタに応じて
      配列を再割り当てします

      ReDim Preserve astrProcName(intProcNum)
      '新たなプロシージャ名を配列に割り当てます
      astrProcName(intProcNum) = strProcName
      'プロシージャ数のカウンタをインクリメントします
      intProcNum = intProcNum + 1
    End If
  Next iintLoop
 
  '配列上のプロシージャ名を列挙します
  For iintLoop = 0 To UBound(astrProcName)
    Debug.Print astrProcName(iintLoop)
  Next iintLoop
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved