🔧
ListAllMacros
ユーティリティブック内のすべてのマクロ(プロシージャ)を一覧表示する
ブック内に含まれる全VBAマクロ(プロシージャ)の一覧をVBAで自動生成するマクロです。VBA Extensibility Library(VBIDE)を使ってVBAProjectのコンポーネントとプロシージャを走査し、名前・モジュール・行数などの情報を新規シートに出力します。ブックの引継ぎや棚卸し、ドキュメント化に役立ちます。VBAプロジェクトへのアクセス許可設定が必要です。内部ではVBA Extensibility Library(VBIDE)を参照設定した上でVBAProjectオブジェクトを走査し、各コンポーネントのCodeModule.CountOfLinesやProcNameFromLineメソッドでプロシージャ名を取得しています。ListAllSheetsがシート構成を可視化するのに対し、本マクロはコードベースの構成を可視化する役割を担い、両者を合わせて実行すればブック全体の完全なドキュメント化が可能になります。

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行するとこのブックに保存されているすべてのマクロ一覧が出力される
🎯 活用シーン
- ✓複数のVBAプロジェクトのマクロ一覧を作成して資産棚卸しを実施
- ✓ブック引継ぎ時のマクロ仕様書を自動生成してドキュメント化
- ✓マクロの使用状況を定期的に記録して未使用マクロを特定
- ✓長年改修を重ねたマクロブックの全体像を、新しい担当者に引き継ぐ資料として整理したいとき
- ✓似た機能のマクロが複数存在していないか棚卸しし、重複コードの統合を検討したいとき
💡 実装のヒント
- ▸VBAIDEを使うにはツール→参照設定でMicrosoft Visual Basic for Applications Extensibilityを追加します
- ▸VBComponent.CodeModule.CountOfLines でモジュールの行数を取得できます
- ▸ProcNameFromLine メソッドでプロシージャ名を取得できます
- ▸VBAプロジェクトへのアクセスには「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」設定(トラストセンター)を有効にする必要があります。
- ▸取得したプロシージャ一覧に呼び出し元・呼び出し先の関係も記録できると、より実用的な仕様書に近づきます。
💻 VBAコード
' ListAllMacros
' -----------------
' Macro Name: ListAllMacros
' Description: ブック内のすべてのマクロ(プロシージャ)を一覧表示する
' Parameters: なし
' Returns: なし
' Usage: 実行するとこのブックに保存されているすべてのマクロ一覧が出力される
' -----------------
Sub ListAllMacros()
Dim vbComp As Object
Dim proc As Variant
Dim ws As Worksheet
Dim outputRow As Long
Dim lastRow As Long
Dim outStr As String
Dim procType As String
Dim procCount As Long
On Error GoTo ErrorHandler
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If lastRow < 1 Then lastRow = 1
outputRow = lastRow + 2
ws.Cells(outputRow, 1).Value = "マクロ一覧"
ws.Cells(outputRow, 1).Font.Bold = True
ws.Cells(outputRow, 1).Font.Size = 14
outputRow = outputRow + 1
procCount = 0
For Each vbComp In ActiveWorkbook.VBProject.VBComponents
If vbComp.Type = 100 Then
Dim modCode As Object
Set modCode = vbComp.CodeModule
Dim startLine As Long
startLine = 1
Do While startLine < modCode.CountOfLines
On Error Resume Next
Dim procName As String
procName = modCode.ProcOfLine(startLine, 0)
On Error GoTo ErrorHandler
If procName <> "" Then
Dim procKind As Long
procKind = modCode.ProcKindOfLine(startLine, 0)
Select Case procKind
Case 1: procType = "Sub"
Case 2: procType = "Function"
Case 3: procType = "Property Get"
Case 4: procType = "Property Let"
Case 5: procType = "Property Set"
Case Else: procType = "不明"
End Select
If procCount = 0 Then
ws.Cells(outputRow, 1).Value = "モジュール"
ws.Cells(outputRow, 2).Value = "種類"
ws.Cells(outputRow, 3).Value = "マクロ名"
ws.Cells(outputRow, 1).Font.Bold = True
ws.Cells(outputRow, 2).Font.Bold = True
ws.Cells(outputRow, 3).Font.Bold = True
ws.Range(ws.Cells(outputRow, 1), ws.Cells(outputRow, 3)).Interior.Color = RGB(200, 200, 200)
outputRow = outputRow + 1
End If
ws.Cells(outputRow, 1).Value = vbComp.Name
ws.Cells(outputRow, 2).Value = procType
ws.Cells(outputRow, 3).Value = procName
outputRow = outputRow + 1
procCount = procCount + 1
startLine = modCode.ProcStartLine(procName, 0) + modCode.ProcCountLines(procName, 0)
Else
startLine = startLine + 1
End If
Loop
End If
Next vbComp
If procCount = 0 Then
ws.Cells(outputRow, 1).Value = "マクロは見つかりませんでした"
Else
ws.Cells(outputRow, 1).Value = "合計: " & procCount & " 件"
ws.Cells(outputRow, 1).Font.Bold = True
End If
ws.Columns("A:C").AutoFit
MsgBox procCount & " 件のマクロが見つかりました。", vbInformation
Exit Sub
ErrorHandler:
If Err.Number = 9 Then
MsgBox "この操作には VBA プロジェクトへのアクセス許可が必要です。" & vbCrLf & "ツール > 参照設定で『Microsoft Visual Basic for Applications Extensibility』を有効にしてください。", vbCritical
Else
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End If
End Sub