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

#モジュール数と行数を把握したい
過去に書き溜めたVBAのコード（Accessメイン）を
備忘録代わりにちょっとずつ書いていきます。

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

#事前準備（Excel2010）
Excelの場合、下記設定が必須（未設定の場合、エラーが発生する）
ファイル＞オプション＞セキュリティセンター＞セキュリティセンターの設定＞マクロの設定
![SecurityCenter.PNG](https://qiita-image-store.s3.amazonaws.com/0/389667/54e6b814-53b1-b56b-bf37-71aaa34fe1bc.png)
- 「すべてのマクロを有効にする」にチェック
- 「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェック
![VBAproject.PNG](https://qiita-image-store.s3.amazonaws.com/0/389667/5f57a9b8-a846-b115-1a14-bbda0850ef6b.png)

#事前準備（Access2010）
Excelと違い、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」は<b>無い</b>が、
念のため「マクロの設定」が有効か確認

ファイル＞オプション＞セキュリティセンター＞セキュリティセンターの設定＞マクロの設定
![Access_SecurityCenter2.PNG](https://qiita-image-store.s3.amazonaws.com/0/389667/3da9b41e-84cc-943b-5cbc-cf569e791c6b.png)
- 「すべてのマクロを有効にする」にチェック
![Access_SecurityCenter.PNG](https://qiita-image-store.s3.amazonaws.com/0/389667/5abdd5a6-2674-7033-e0c8-39220b9aff1e.png)

#以下、コード（共通化してもよいのですが分けてます）
##Excel版のコード
```vb

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
```
##&nbsp;&nbsp;Excel版の結果
![結果1.png](https://qiita-image-store.s3.amazonaws.com/0/389667/ddcd2e3b-78b5-75ac-168a-4285aa5c3789.png)


##Access版のコード
```vb

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
```


##&nbsp;&nbsp;Access版の結果
![結果.png](https://qiita-image-store.s3.amazonaws.com/0/389667/015ab5d8-a0b7-c2a3-123d-8bfa1fde5d58.png)

#動作確認済み環境
- Excel
    - 2007,2010
- Access
    - 2003,2007,2010,2013