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

スポンサーリンク

【Access】VBEをハックせよ:プロシージャ一括抽出による「ブラックボックス化」の完全回避

Accessで開発を続けていると、必ず直面する「技術的負債」がある。数年前に誰が書いたか分からない、仕様書も存在しない数万行のコード。保守を引き継いだエンジニアがまず行うべきは、「今、何がどこにあるのか」の地図を作ることだ。

今回は、Accessの隠しコマンドとも言える`Application.VBE`オブジェクトを直接操作し、全モジュールの全プロシージャを抽出してドキュメント化する、真に実戦的なアプローチを伝授する。

なぜ「手作業」や「エクスポート」ではいけないのか

多くの現場では、モジュールをテキストファイルにエクスポートしてgrepで検索する手法が取られる。しかし、それは「静的なスナップショット」に過ぎない。

我々が目指すべきは、「実行中のアプリケーション自身が、自身の構造をメタ解析する」という設計だ。これには以下のメリットがある。

1. 即時性: 修正直後に再スキャンすれば、変更が即座にドキュメントに反映される。
2. 型安全と自動化: 抽出結果をテーブルに格納すれば、プロシージャの数や複雑度を数値化(メトリクス解析)できる。
3. 属人化の排除: 誰が担当しても、ツールを叩けば最新の構成図が出力される。

堅牢な設計のための「3つの鉄則」

VBEオブジェクトを扱う際、初心者が陥りがちな罠が「参照設定」と「セキュリティ」だ。

  • 参照設定の「遅延バインディング」: `Microsoft Visual Basic for Applications Extensibility 5.3` を手動で追加させてはならない。環境に依存する参照設定は事故の元だ。今回はあえてオブジェクト型で宣言し、実行時にバインドする。
  • 「信頼できる場所」の徹底: VBEへのアクセスは、セキュリティ設定で「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」がオンになっていなければ例外が発生する。これをコード内で判定し、ユーザーに警告を出す設計が必須だ。
  • 再帰的な走査: 標準モジュール、クラスモジュール、フォーム/レポートのコードモジュール、これらを漏れなく再帰的に辿る構造にする必要がある。

プロダクションコード:VBEメタ解析ツール

以下のコードは、データベース内の全モジュールからプロシージャ名を抽出し、イミディエイトウィンドウに出力する。これをテーブルへ書き出すロジックに変えれば、立派な保守ツールになる。

Option Explicit

‘ ————————————————————————–
‘ @Title: Accessモジュール構成解析エンジン
‘ @Description: VBEオブジェクトを解析し、全プロシージャをリストアップする
‘ ————————————————————————–
Public Sub ExportProcedureList()
Dim vbeObj As Object ‘ Late Binding
Dim vbComp As Object
Dim codeMod As Object
Dim i As Long, startLine As Long, procName As String

‘ 1. セキュリティ設定の確認(VBEアクセス権限)
On Error Resume Next
Set vbeObj = Application.VBE
If Err.Number <> 0 Then
MsgBox “エラー: VBAプロジェクトへのアクセスが許可されていません。” & vbCrLf & _
“オプション設定で「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にしてください。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 2. 各コンポーネントの走査
For Each vbComp In vbeObj.ActiveVBProject.VBComponents
Set codeMod = vbComp.CodeModule

i = codeMod.CountOfDeclarationLines + 1

Do While i < codeMod.CountOfLines ' プロシージャ名の取得(ProcOfLineはプロシージャ名を返す) procName = codeMod.ProcOfLine(i, 0) ' 0 = vbext_pk_Proc If procName <> “” Then
Debug.Print “Module: ” & vbComp.Name & ” | Procedure: ” & procName
‘ 次のプロシージャまでインデックスをスキップ
i = i + codeMod.ProcCountLines(procName, 0)
Else
i = i + 1
End If
Loop
Next vbComp

MsgBox “解析完了。イミディエイトウィンドウを確認してください。”
End Sub

プロフェッショナルへのアドバイス

このコードを実装する際、単にリストを出すだけでなく、「プロシージャの行数」を合わせて取得することを推奨する。

`codeMod.ProcCountLines(procName, 0)` を使えば、そのプロシージャが何行あるかが分かる。200行を超えるメソッドは「リファクタリングの対象」としてフラグを立てる。こうして「解析ツール」を「品質管理ツール」へと昇華させるのが、我々のような自動化エンジニアの腕の見せ所だ。

Accessは古い技術ではない。それをどう制御し、どう可視化するか。その設計思想こそが、開発者の価値を決定づける。さあ、今すぐこのコードをプロジェクトに組み込み、ブラックボックスを解体してほしい。

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