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