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の初学者ではありません。さあ、次はどんな自動化を企てますか?応援しています。
