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

スポンサーリンク

Access VBAを掌握せよ:VBEオブジェクトでコードを解析し、命名規則の崩壊を食い止める

大規模なAccess開発において、最大の敵は「スパゲッティコード」ではなく「統制の取れた規約の欠如」だ。数年経過したプロジェクトで、誰が書いたか不明な`Sub Command1_Click()`が散乱し、リファクタリングもままならない状態に陥っていないか?

本稿では、Accessの心臓部である`VBE`(Visual Basic for Applications Extensibility)ライブラリを直接叩き、プロジェクト内の全プロシージャ名を抽出・監査する「コード品質監査ツール」の極限設計を伝授する。

1. なぜ「VBEオブジェクト」を使うべきなのか

多くのエンジニアが、フォームやクエリの情報を取得するために`CurrentProject`や`AllForms`を使うが、コードそのものを解析するとなると途端に手が止まる。

VBAのコードをプログラムから解析するには、`Microsoft Visual Basic for Applications Extensibility 5.3`というライブラリへの参照が必要だ。これを理解しているかどうかで、君が「Accessを操作する人」なのか「Accessのアーキテクチャを掌握するエンジニア」なのかが決まる。

準備:参照設定の壁を越える

VBEを操作するには、VBAエディタで[ツール] > [参照設定]を開き、「Microsoft Visual Basic for Applications Extensibility 5.3」にチェックを入れろ。これがないと、`VBProject`や`CodeModule`といった核心的なオブジェクトにアクセスできない。

2. プロダクションコード:命名規則監査ツール

単にプロシージャ名を取るだけなら初学者でもできる。我々が求めるのは、「命名規則から逸脱したモジュールを即座に特定する堅牢な実装」だ。

以下のコードは、プロジェクト内の全プロシージャを走査し、規約(例: `fn_`で始まるべき関数を検知)に違反するものをイミディエイトウィンドウに書き出す。

Option Explicit

‘ 必要な参照設定: Microsoft Visual Basic for Applications Extensibility 5.3
Public Sub AuditProcedureNames()
Dim vbp As VBProject
Dim comp As VBComponent
Dim codeMod As CodeModule
Dim i As Long, lineCount As Long
Dim procName As String, procKind As vbext_ProcKind

Set vbp = Application.VBE.ActiveVBProject

Debug.Print “— 監査開始: ” & Now & ” —”

‘ モジュールを走査
For Each comp In vbp.VBComponents
Set codeMod = comp.CodeModule
lineCount = codeMod.CountOfLines

If lineCount > 0 Then
i = codeMod.CountOfDeclarationLines + 1

Do While i <= lineCount ' プロシージャ名を取得 procName = codeMod.ProcOfLine(i, procKind) ' 重複解析を避けるため、プロシージャの先頭行のみ処理 If i = codeMod.ProcStartLine(procName, procKind) Then ' ここに命名規則のロジックを実装 ' 例: Publicな関数は 'fn_' で始まる必要がある If Left(procName, 3) <> “fn_” Then
Debug.Print “【警告】命名規約違反: [” & comp.Name & “] -> ” & procName
End If

‘ 次のプロシージャへジャンプ
i = i + codeMod.ProcCountLines(procName, procKind)
Else
i = i + 1
End If
Loop
End If
Next comp

Debug.Print “— 監査終了 —”
End Sub

3. 実務で勝つための「3つの極意」

① 「行数」でループを回すな

初心者は`Lines`プロパティを使って全行を舐めようとするが、これは非効率だ。`ProcStartLine`と`ProcCountLines`を組み合わせることで、プロシージャの塊を一気にスキップするアルゴリズムを組め。コードベースが数万行を超えた時、この差が処理時間の致命的な差となる。

② 参照設定を動的に行う(上級者向け)

配布ツールにする場合、毎回「参照設定」をさせるのはユーザーフレンドリーではない。`Access.Application`の`References.AddFromGuid`を使用し、ツール実行時にプログラム側からライブラリを読み込む設計にすれば、運用負荷はゼロになる。

③ 「安全な」リファクタリングのために

このツールで抽出したリストを基に、手動で修正するのはナンセンスだ。CSVに出力し、Gitの差分ログと照らし合わせる。自動化とは、単にコードを動かすことではなく、「変更の責任範囲を明確にすること」を指す。

最後に:エンジニアとしての矜持

VBEオブジェクトを直接操作するツールを作ることは、自分の書いたコード、あるいはチームのコードを「メタ(俯瞰)」の視点で見つめる行為だ。

もし君が大規模なAccess開発で疲弊しているなら、まずはこのツールで現状の「命名の乱れ」を可視化することから始めろ。真の自動化エンジニアは、ツールを作るだけでなく、そのツールを使って「負債のない文化」を構築する人間だ。

さあ、エディタを開け。君のプロジェクトの「真実」を暴く時が来た。

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