VBAの各モジュールの数と行数を調べる方法


モジュール数と行数を把握したい

過去に書き溜めたVBAのコード(Accessメイン)を
備忘録代わりにちょっとずつ書いていきます。

今回は、モジュール数と行数を把握したい場合について。
下記のコードを実行すれば、楽に把握できます。
(Excel、Access両方対応)

事前準備(Excel2010)

Excelの場合、下記設定が必須(未設定の場合、エラーが発生する)
ファイル>オプション>セキュリティセンター>セキュリティセンターの設定>マクロの設定

- 「すべてのマクロを有効にする」にチェック
- 「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェック

事前準備(Access2010)

Excelと違い、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」は無いが、
念のため「マクロの設定」が有効か確認

ファイル>オプション>セキュリティセンター>セキュリティセンターの設定>マクロの設定

- 「すべてのマクロを有効にする」にチェック

以下、コード(共通化してもよいのですが分けてます)

Excel版のコード


Sub CountAllCodeLine()

'//コード総行数の取得
'//Excel版

Dim moduCount As Long
Dim i As Integer
Dim AllLine As Long
Dim k As Long
Dim strTemp As String
Dim lnPropertyProc As Long
Dim lnSubProc As Long
Dim lnFunctionProc As Long
Dim strType As String


With Excel.Application.VBE.ActiveVBProject
'With Access.Application.VBE.ActiveVBProject
    moduCount = .VBComponents.Count
        For i = 1 To moduCount
            AllLine = AllLine + CLng(.VBComponents(i).CodeModule.CountOfLines)
                With .VBComponents(i).CodeModule
                    For k = 1 To .CountOfLines
                        strTemp = .Lines(k, 1)
                        If strTemp Like "*End Sub*" Then
                            lnSubProc = lnSubProc + 1
                        ElseIf strTemp Like "*End Function*" Then
                            lnFunctionProc = lnFunctionProc + 1
                        ElseIf strTemp Like "*End Property*" Then
                            lnPropertyProc = lnPropertyProc + 1
                        End If
                    Next k
                End With
            Select Case .VBComponents(i).Type
                Case 1:   strType = "標準モジュール"
                Case 2:   strType = "クラスモジュール"
                Case 3:   strType = "フォーム"
                Case 100: strType = "シートorブック"
                Case Else:     strType = Str(.VBComponents(i).Type)
            End Select
            Debug.Print strType & "…" & .VBComponents(i).Name & ":" & .VBComponents(i).CodeModule.CountOfLines & "行"
        Next i
        lnSubProc = lnSubProc - 1
        lnFunctionProc = lnFunctionProc - 1
        lnPropertyProc = lnPropertyProc - 1
        Debug.Print "総行数 : " & AllLine & " 行" & vbCrLf & _
                    "総モジュール数 : " & moduCount & " 個" & vbCrLf & _
                    "サブプロシージャ数 : " & lnSubProc & " 個" & vbCrLf & _
                    "ファンクションプロシージャ数 : " & lnFunctionProc & " 個" & vbCrLf & _
                    "プロパティプロシージャ数 : " & lnPropertyProc & " 個" & vbCrLf & _
                    "平均コード行数 : " & AllLine / (lnSubProc + lnFunctionProc + lnPropertyProc) & " 行"

End With

End Sub

  Excel版の結果

Access版のコード


Sub CountAllCodeLine()

'//モジュール数とコード総行数の取得
'//Access版

Dim moduCount As Long
Dim i As Integer
Dim AllLine As Long
Dim k As Long
Dim strTemp As String
Dim lnPropertyProc As Long
Dim lnSubProc As Long
Dim lnFunctionProc As Long
Dim strType As String


With Access.Application.VBE.ActiveVBProject
    moduCount = .VBComponents.Count
        For i = 1 To moduCount
            AllLine = AllLine + CLng(.VBComponents(i).CodeModule.CountOfLines)
                With .VBComponents(i).CodeModule
                    For k = 1 To .CountOfLines
                        strTemp = .Lines(k, 1)
                        If strTemp Like "*End Sub*" Then
                            lnSubProc = lnSubProc + 1
                        ElseIf strTemp Like "*End Function*" Then
                            lnFunctionProc = lnFunctionProc + 1
                        ElseIf strTemp Like "*End Property*" Then
                            lnPropertyProc = lnPropertyProc + 1
                        End If
                    Next k
                End With
            Select Case .VBComponents(i).Type
                Case 1:   strType = "標準モジュール"
                Case 2:   strType = "クラスモジュール"
                Case Else:     strType = Str(.VBComponents(i).Type)
            End Select
            Debug.Print strType & "…" & .VBComponents(i).Name & ":" & .VBComponents(i).CodeModule.CountOfLines & "行"
        Next i
        lnSubProc = lnSubProc - 1
        lnFunctionProc = lnFunctionProc - 1
        lnPropertyProc = lnPropertyProc - 1
        Debug.Print "総行数 : " & AllLine & " 行" & vbCrLf & _
                    "総モジュール数 : " & moduCount & " 個" & vbCrLf & _
                    "サブプロシージャ数 : " & lnSubProc & " 個" & vbCrLf & _
                    "ファンクションプロシージャ数 : " & lnFunctionProc & " 個" & vbCrLf & _
                    "プロパティプロシージャ数 : " & lnPropertyProc & " 個" & vbCrLf & _
                    "平均コード行数 : " & AllLine / (lnSubProc + lnFunctionProc + lnPropertyProc) & " 行"

End With

End Sub

  Access版の結果

動作確認済み環境

  • Excel
    • 2007,2010
  • Access
    • 2003,2007,2010,2013