【実務・中級編】Application.VBEオブジェクトを用いたモジュール内のプロシージャ名一括取得とドキュメント化 – Access VBA解析バイブル

スポンサーリンク

コードを「俯瞰」せよ: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は「書くもの」から「制御するもの」へ進化させなければなりません。
今回紹介したスクリプトは、あなたのプロジェクトの全貌を可視化するための「最初の石」です。ここから、引数の詳細取得、コメント行の自動抽出へと機能を拡張し、あなただけの「最強のドキュメント生成エンジン」を育て上げてください。

コードという複雑な迷宮を支配するのは、いつでもその構造を俯瞰できる者だけです。

タイトルとURLをコピーしました