LoginSignup
3
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-09

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

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

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

事前準備(Excel2010)

Excelの場合、下記設定が必須(未設定の場合、エラーが発生する)
ファイル>オプション>セキュリティセンター>セキュリティセンターの設定>マクロの設定
SecurityCenter.PNG
- 「すべてのマクロを有効にする」にチェック
- 「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェック
VBAproject.PNG

事前準備(Access2010)

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

ファイル>オプション>セキュリティセンター>セキュリティセンターの設定>マクロの設定
Access_SecurityCenter2.PNG
- 「すべてのマクロを有効にする」にチェック
Access_SecurityCenter.PNG

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

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版の結果

結果1.png

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版の結果

結果.png

動作確認済み環境

  • Excel
    • 2007,2010
  • Access
    • 2003,2007,2010,2013
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4