|
モジュールの中を調べるにはまず「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オブジェクトのプロパティのうち、"プロシージャ"に関するものとして次のプロパティがあります。
これを先ほどのループの中に加えて見てください。なお、変数 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 |