Accessの「神」にアクセスする:VBEオブジェクトでコードを自動解析する方法
Access VBAの世界へようこそ。フォームにボタンを置いてマクロを動かす、そんな「表側の開発」を卒業しようとしているあなたへ。今日は、Accessの心臓部であるVBE(Visual Basic Editor)そのものをプログラムから操作するという、少し刺激的な領域へご案内します。
「自分の書いたコードがどこに何個あるのか分からない」
「仕様書を作るために、プロシージャ名を1つずつ手書きで書き写している」
そんな非効率な作業は、今日で終わりにしましょう。VBEオブジェクトモデルを使いこなせば、「自分のコードを、自分自身でドキュメント化する」という、エンジニア冥利に尽きる自動化が実現できます。
—
1. VBEオブジェクトモデルという「裏口」
通常、私たちは「テーブル」や「フォーム」といったAccessのオブジェクトを操作します。しかし、VBEオブジェクトモデルを使えば、VBAのコードそのものを「データ」として扱うことが可能になります。
これを実現するには、まずAccessの「参照設定」で特別な鍵を開ける必要があります。
準備:参照設定の追加
1. VBE画面(Alt + F11)を開く
2. メニューバーの [ツール] > [参照設定] をクリック
3. リストから 「Microsoft Visual Basic for Applications Extensibility 5.3」 を探し、チェックを入れてOKを押す
これがないと、VBEの内部構造にアクセスするための「チケット」を持っていない状態になります。
—
2. 全プロシージャ名を取得する実装コード
では、実際にデータベース内の全モジュールを巡回し、プロシージャ名をExcelやテーブルに出力するためのエンジンを書きましょう。
Option Explicit
‘ 伝説のアーキテクトが教える、VBE解析の基本エンジン
Public Sub ExportProcedureList()
Dim vbProj As VBIDE.VBProject
Dim vbComp As VBIDE.VBComponent
Dim codeMod As VBIDE.CodeModule
Dim i As Long, procName As String
‘ 現在のプロジェクトを取得
Set vbProj = Application.VBE.ActiveVBProject
Debug.Print “— 解析開始 —”
‘ 全てのコンポーネント(標準モジュール、フォーム、クラス等)をループ
For Each vbComp In vbProj.VBComponents
Set codeMod = vbComp.CodeModule
‘ モジュール内にプロシージャがあるかチェック
i = codeMod.CountOfDeclarationLines + 1
Do While i <= codeMod.CountOfLines
' プロシージャ名を取得
procName = codeMod.ProcOfLine(i, vbext_pk_Proc)
' 同じプロシージャ名が連続するため、重複を除いて出力
If procName <> “” Then
Debug.Print “モジュール: ” & vbComp.Name & ” | プロシージャ: ” & procName
‘ 次のプロシージャまでインデックスを飛ばす
i = i + codeMod.ProcCountLines(procName, vbext_pk_Proc)
Else
i = i + 1
End If
Loop
Next vbComp
Debug.Print “— 解析終了 —”
End Sub
—
3. このコードが「何をしているか」の解剖図
初心者がここで躓きやすいポイントを、あえて解説します。
- `vbext_pk_Proc` とは?: これは「プロシージャの種類」を示す定数です。VBAには単なる宣言行と、SubやFunctionのプロシージャがありますが、この定数を使うことで「コードの塊」だけを正確に抽出できます。
- `CountOfDeclarationLines`: モジュールの冒頭にある `Option Explicit` や変数の宣言領域をスキップするための呪文です。ここを飛ばさないと、エラーや予期せぬ空白行を拾ってしまいます。
- なぜ `Do While` なのか: `For`ループだと、プロシージャの行数がまちまちなので制御が困難です。`i` をプロシージャの行数分だけ強制的に進めることで、スマートに巡回しています。
—
4. 陥りやすい罠と「プロの心得」
この技術を使う上で、一つだけ注意点があります。
「信頼できるソースへのアクセス」です。
Accessの設定で「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックが入っていないと、このプログラムはセキュリティエラーで停止します。
- 対策: [ファイル] > [オプション] > [セキュリティ センター] > [マクロの設定] で該当箇所を確認してください。
これは、自分の書いたコードを外部から改ざんできる強力な権限です。だからこそ、OSやAccessが慎重にガードしているのです。「大きな力には大きな責任が伴う」。この言葉を胸に、自動化ツールを開発してください。
—
まとめ:ここをクリアすれば、あなたはもう中級者
今回紹介したVBE操作は、単なる「リストアップ」に留まりません。応用すれば、「特定のキーワードを含むプロシージャを一括検索する」「コードの行数をカウントして肥大化したモジュールを特定する」といった、保守の自動化が自由自在になります。
Access VBAは、単なる事務処理の道具ではありません。自分の書いたコードを客観的に解析し、自らメンテナンスし続ける。その「自己循環型開発」の入り口に、あなたは今立ちました。
次は、取得したプロシージャ名をテーブルに書き出し、Access上で自分専用の「コード仕様書」を作ってみてください。きっと、Accessを見る目がガラリと変わるはずですよ。
応援しています。分からないことがあれば、いつでもまた聞きに来てくださいね。
