📊 Excel VBA Top100
🔧

ListAllMacros

ユーティリティ

ブック内のすべてのマクロ(プロシージャ)を一覧表示する

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

ListAllMacros デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(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