CodeModuleオブジェクトでは、マクロとして記述しているコードを取得できます。ここでは、よく使うプロパティを解説します。
コードモジュール内に記述されているコードの総行数を返します。
Sub Sample7()
Dim Cnt As Long
Cnt = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines
MsgBox Cnt
End Sub

の場合、

となります。CountOfLinesプロパティは、宣言セクションの行数を含みます。また、Enterだけが入力されている空白行と、コメント行も含まれます。
宣言セクション部分の行数は、CountOfDeclarationLinesプロパティで取得できます。
Sub Sample8()
Dim CodeLine As Long, DeclarationLines As Long
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
DeclarationLines = .CountOfDeclarationLines
CodeLine = .CountOfLines
End With
MsgBox "宣言セクションの行数:" & DeclarationLines & vbCrLf & _
"プロシージャの行数:" & CodeLine - DeclarationLines
End Sub


Linesプロパティの書式は次の通りです。
CodeModule.Lines(startline, count)
引数startlineから、引数countで指定した行分のコードを返します。
Sub Sample9()
Dim Code As String
Code = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(7, 5)
MsgBox Code
End Sub

の場合、

となります。
ProcBodyLineプロパティは、指定したプロシージャの先頭行を返します。
指定する引数は2つです。
CodeModule.ProcBodyLine(procname, prockind)
引数procnameには、先頭行を調べるプロシージャの名前を指定します。
引数prockindには、そのプロシージャの種類を表す次の数値を指定します。
| 値 | 内容 |
|---|---|
| 3 | プロパティの値を取得するプロシージャ |
| 1 | プロパティに値を設定するプロシージャ |
| 2 | オブジェクトへの参照を設定するプロシージャ |
| 0 | 上記以外のすべてのプロシージャ |
一般的なSubプロシージャやFunctionプロシージャを指定するときは0を指定します。
Sub Sample10()
Dim Cnt As Long
Cnt = ThisWorkbook.VBProject.VBComponents("Module1"). _
CodeModule.ProcBodyLine("Sample10", 0)
MsgBox Cnt
End Sub


ProcCountLinesプロパティは、指定したプロシージャの行数を返します。
指定する引数はProcBodyLineプロパティと同じです。
ProcCountLinesプロパティは、指定したプロシージャの宣言行(Sub ○○やFunction××など)以前にある空白行やコメント行から、プロシージャの終了行(End SubやEnd Functionなど)までの行数を返します。指定したプロシージャがコードモジュール内で最後のプロシージャだった場合は、終了行以降の空白行やコメント行も含みます。
Sub Sample11()
Dim Cnt As Long
Cnt = ThisWorkbook.VBProject.VBComponents("Module1"). _
CodeModule.ProcCountLines("Sample11", 0)
MsgBox Cnt
End Sub


ProcOfLineプロパティは、指定した行を含むプロシージャの名前を返します。
CodeModule.ProcOfLine(line, prockind)
引数lineには行数を指定します。
引数prockindは、ProcBodyLineプロパティと同じようにプロシージャの種類を表す数値を指定します。
Sub Sample12()
Dim ProcName As String
ProcName = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ProcOfLine(9, 0)
MsgBox ProcName
End Sub


ProcStartLineプロパティは、指定したプロシージャの開始行を返します。
指定する引数は、ProcCountLinesプロパティと同じです。
Sub Sample13()
Dim Cnt As Long
Cnt = ThisWorkbook.VBProject.VBComponents("Module1"). _
CodeModule.ProcStartLine("Sample13", 0)
MsgBox Cnt
End Sub


プロシージャの開始行とプロシージャの宣言行(Sub ○○やFunction××など)とは異なります。プロシージャの開始行は、宣言セクションの終了行の次行、または直前プロシージャの終了行(End SubやEnd Functionなど)の次行です。上記の例では「Sub Sample13()」の1行上である空白行が開始行とみなされます。
CodeModuleオブジェクトには、宣言されているすべてのプロシージャ名を一発で返すプロパティがありません。コードモジュール内にどんなプロシージャが書かれているかの一覧を調べるには、たとえば次のようにします。
Sub Sample14()
Dim buf As String, ProcNames As String, i As Long
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
For i = 1 To .CountOfLines
If buf <> .ProcOfLine(i, 0) Then
buf = .ProcOfLine(i, 0)
ProcNames = ProcNames & buf & vbCrLf
End If
Next i
End With
MsgBox ProcNames
End Sub

