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