CodeModuleのプロパティ


CodeModuleオブジェクトでは、マクロとして記述しているコードを取得できます。ここでは、よく使うプロパティを解説します。

CountOfLinesプロパティ・CountOfDeclarationLinesプロパティ

コードモジュール内に記述されているコードの総行数を返します。

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プロパティ

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プロパティ・ProcCountLinesプロパティ・ProcOfLineプロパティ・ProcStartLineプロパティ

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