コードを「俯瞰」せよ:VBEオブジェクトでプロシージャ一覧を自動生成する極意
Access開発の現場で、大規模なシステムを保守していると必ず直面する「負債」。それは「どのモジュールに、どんなロジックが埋まっているか分からない」というブラックボックス化です。
ドキュメントが更新されていない? そんなのは当たり前です。コードそのものをドキュメントにするのではなく、コードからドキュメントを生成する仕組みを構築する。 これが、真にプロフェッショナルな業務自動化エンジニアの戦い方です。
今日は、`Application.VBE` オブジェクトを叩き、全モジュールからプロシージャ名と引数情報を強制的に抽出する、実戦投入レベルのツールを伝授します。
—
1. なぜ「手動」でのドキュメント管理は死ぬのか
Excelで「機能一覧」を手動管理しているプロジェクトは、例外なく崩壊します。理由は簡単、「コードの変更速度」に「人間の更新速度」が追いつかないからです。
VBE(Visual Basic Editor)は、単なるコード編集画面ではありません。VBAプロジェクトを操作するための、極めて強力なAPIインターフェースそのものです。これを使わない手はありません。
2. 開発上の重大な注意点:参照設定の壁
このツールを作る際、避けては通れないのが「Microsoft Visual Basic for Applications Extensibility 5.3」への参照設定です。
- 落とし穴: コード内で `VBE` オブジェクトを呼び出すには、必ずこのライブラリが必要です。しかし、配布先の環境で参照設定が外れていれば一発でエラーになります。
- 解決策: 「遅延バインディング(Late Binding)」の使用を検討すべきですが、今回は開発効率を優先し、参照設定を前提とした設計にします。もし配布ツール化するなら、`Application.References.AddFromGuid` を駆使し、実行時に自動で参照設定を組み込む「自己修復機能」を実装するのがプロの流儀です。
—
3. 実装コード:プロシージャ抽出のエンジン
以下のコードを標準モジュールに貼り付けてください。単に名前を拾うだけでなく、引数の数や型まで解析する一歩先の実装です。
Option Explicit
‘ 参照設定: Microsoft Visual Basic for Applications Extensibility 5.3
‘ 参照設定: Microsoft Office 16.0 Object Library (Excel出力用)
Public Sub ExportProcedureList()
Dim vbProj As VBIDE.VBProject
Dim vbComp As VBIDE.VBComponent
Dim vbMod As VBIDE.CodeModule
Dim i As Long, lineNum As Long
Dim procName As String
Dim procKind As vbext_ProcKind
Set vbProj = Application.VBE.ActiveVBProject
‘ ここでExcelへの出力準備(省略:適切なシートを指定すること)
Debug.Print “Module,ProcedureName,Type”
‘ プロジェクト内の全コンポーネントを巡回
For Each vbComp In vbProj.VBComponents
Set vbMod = vbComp.CodeModule
lineNum = vbMod.CountOfDeclarationLines + 1
Do Until lineNum >= vbMod.CountOfLines
procName = vbMod.ProcOfLine(lineNum, procKind)
‘ プロシージャ名の重複取得を防ぐロジック
If procName <> “” Then
Debug.Print vbComp.Name & “,” & procName & “,” & GetProcKindName(procKind)
‘ 次のプロシージャまで行を飛ばす
lineNum = vbMod.ProcStartLine(procName, procKind) + vbMod.ProcCountLines(procName, procKind)
Else
lineNum = lineNum + 1
End If
Loop
Next vbComp
End Sub
Private Function GetProcKindName(kind As vbext_ProcKind) As String
Select Case kind
Case vbext_pk_Proc: GetProcKindName = “Sub/Function”
Case vbext_pk_Let: GetProcKindName = “Property Let”
Case vbext_pk_Set: GetProcKindName = “Property Set”
Case vbext_pk_Get: GetProcKindName = “Property Get”
End Select
End Function
—
4. 堅牢な設計のためのエンジニアリング知識
このコードを「プロダクション品質」にするために、以下の3点を意識してください。
1. 境界値の処理: `vbMod.CountOfDeclarationLines` を起点にしているのは、宣言部(変数定義など)を誤ってプロシージャとしてカウントしないためです。この行数を無視する設計は、解析ツールにおける鉄則です。
2. `ProcOfLine` の罠: `ProcOfLine` メソッドは、指定した行がどのプロシージャに属しているかを返します。これを使ってループを回すことで、空行をスキップし、飛躍的に解析速度を向上させています。
3. 信頼性: このコードを実行する際、Accessのオプション「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックが入っている必要があります。これをツール起動時に `RegWrite` で強制的に設定するような「管理者権限の介入」を実装するのが、現場で評価されるエンジニアの仕事です。
結論
VBAは「書くもの」から「制御するもの」へ進化させなければなりません。
今回紹介したスクリプトは、あなたのプロジェクトの全貌を可視化するための「最初の石」です。ここから、引数の詳細取得、コメント行の自動抽出へと機能を拡張し、あなただけの「最強のドキュメント生成エンジン」を育て上げてください。
コードという複雑な迷宮を支配するのは、いつでもその構造を俯瞰できる者だけです。
