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

スポンサーリンク

Access VBAを掌握せよ:VBEを「自ら操作する」禁断のコード解析術

こんにちは。大規模システムの現場で、数百万行のコードと格闘してきたエンジニアです。

Access VBAを使っていると、「コードを書いて動かす」段階から、「コードそのものをデータとして扱う」という一段上のステージに到達したくなる瞬間が必ず訪れます。特に、チーム開発で命名規則が崩壊した時、一つ一つ手作業で確認しますか? いいえ、そんなのはエンジニアの仕事ではありません。

今日は、Accessの心臓部である「VBE(Visual Basic Editor)」をプログラムから操作し、プロジェクト内の全プロシージャ名を一括抽出するツールの作り方を伝授します。

1. なぜ「VBEオブジェクト」を知る必要があるのか?

通常、私たちは`DoCmd`や`CurrentDb`といった「Accessのデータベース機能」を操作します。しかし、VBAコードそのものを操作するには、`Microsoft Visual Basic for Applications Extensibility 5.3` という特別なライブラリを参照設定する必要があります。

これは、VBAという言語が「自分自身を構成する部品」を外部(あるいは内部)に公開していることを意味します。これを使いこなせば、命名規則違反の摘発だけでなく、自動ドキュメント生成やコードの自動整形ツールすら作れるようになります。

準備:参照設定を忘れずに

1. VBEのメニューから「ツール」→「参照設定」を選択。
2. リストの中から 「Microsoft Visual Basic for Applications Extensibility 5.3」 にチェックを入れてください。これがないと、コードが動きません。

2. プロシージャ名一括取得ツールの全貌

まずは、プロジェクト内の全標準モジュールを走査し、プロシージャ名をイミディエイトウィンドウに出力するコードです。これを土台に、あなたの望む「リファクタリング支援ツール」へと拡張してください。

Sub ListAllProcedures()
‘ VBEのプロジェクトを操作するためのオブジェクト変数
Dim vbProj As VBIDE.VBProject
Dim vbComp As VBIDE.VBComponent
Dim codeMod As VBIDE.CodeModule
Dim procName As String
Dim lineNum As Long

‘ 現在のプロジェクトを取得
Set vbProj = Application.VBE.ActiveVBProject

‘ すべてのモジュール(フォームや標準モジュール)をループ
For Each vbComp In vbProj.VBComponents
Set codeMod = vbComp.CodeModule

‘ モジュール内のコードを上から順に走査
lineNum = codeMod.CountOfDeclarationLines + 1

Do While lineNum < codeMod.CountOfLines ' プロシージャの開始行名を取得 procName = codeMod.ProcOfLine(lineNum, vbext_pk_Proc) ' プロシージャ名があれば出力 If procName <> “” Then
Debug.Print “モジュール: ” & vbComp.Name & ” | プロシージャ: ” & procName

‘ プロシージャの終了行までスキップ(重複取得を防ぐ)
lineNum = codeMod.ProcStartLine(procName, vbext_pk_Proc) + _
codeMod.ProcCountLines(procName, vbext_pk_Proc)
Else
lineNum = lineNum + 1
End If
Loop
Next vbComp

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

3. コードの解説:ここが「プロ」への分かれ道

このコードには、Access VBAを極めるための重要なエッセンスが詰まっています。

  • `vbComp.CodeModule`:

コードそのものが書き込まれている「入れ物」です。ここを叩けば、コードを読み取るだけでなく、`DeleteLines`や`InsertLines`でコードを書き換えることも可能です。

  • `ProcOfLine`の役割:

指定した行がどのプロシージャに含まれているかを判定します。これを使わずに単純に文字列検索をすると、コメントアウトされたコードや、変数名と混同して誤検知します。

  • `lineNum`のジャンプ:

プロシージャ名を見つけたら、そのプロシージャの終了行まで一気にスキップしています。これにより、無駄なループを回さず、高速かつ正確に解析を行うことができます。

4. 陥りやすい罠:セキュリティ設定

このコードを実行しようとしたとき、「プログラムによる Visual Basic プロジェクトへのアクセスは信頼されていません」というエラーが出ることがあります。

これは、悪意のあるプログラムが勝手にコードを書き換えるのを防ぐためのAccessの安全装置です。

  • 解決策: Accessの「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「マクロの設定」から、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを入れてください。

最後に:エンジニアとしての一歩先へ

今回紹介した技術は、単なる「抽出」に留まりません。
「命名規則に従っていないプロシージャ名を見つけたら、その行番号をログに吐き出す」「特定のキーワードを自動的に修正する」といったロジックを組めば、数万行規模のレガシーシステムのリファクタリングも、わずか数秒の作業になります。

「マクロの記録」で生成されたコードを動かす段階は卒業です。「コードの構造」を操る側に回ったとき、Accessは単なるデータベースソフトから、最強の自動化エンジンへと姿を変えます。

ここを理解できれば、あなたはもうAccess VBAの初学者ではありません。さあ、次はどんな自動化を企てますか?応援しています。

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