Access VBAの深淵へ:全コードを掌握する「動的解析ツール」の作り方
こんにちは。大規模なAccessシステムを運用していると、ある日突然「この関数、どこで使われているんだろう?」という迷宮に迷い込むことはありませんか?
マクロの記録から一歩踏み出し、プロとしてシステムを保守したいあなたへ。今日は、Access VBAの心臓部に直接アクセスし、プロジェクト内の全コードを解析する「究極の守護ツール」の作り方を伝授します。
—
1. なぜ「CurrentProject.AllModules」なのか?
通常の開発では「フォームやレポート」の画面を作ることに集中しがちですが、保守の現場で最も重要なのは「コードの海」を俯瞰する能力です。
`Application.CurrentProject.AllModules` は、データベース内に存在する全ての標準モジュール・クラスモジュールの情報を保持するコレクションです。これを使うと、わざわざ一つずつモジュールを開かなくても、プログラムの力だけで全コードの「中身」を読み取ることができます。
押さえておくべきオブジェクトの階層
- Application: Accessそのもの。
- CurrentProject: 現在開いているデータベース。
- AllModules: 全モジュールのリスト。
- AccessObject: 個々のモジュール(これがコードの塊です)。
—
2. 実践:全コードを走査する「コード解析エンジンの雛形」
まずは、データベース内の全モジュールを巡回し、指定したキーワードが含まれる行をイミディエイトウィンドウに書き出すツールを作ってみましょう。
‘ 【解説】このプロシージャは、全モジュールを走査して特定の関数名や変数を検索します
Public Sub SearchCodeAcrossDatabase(ByVal targetKeyword As String)
Dim objModule As AccessObject
Dim strModuleName As String
Dim i As Long
Dim strLine As String
‘ 全モジュールをループで巡回
For Each objModule In CurrentProject.AllModules
strModuleName = objModule.Name
‘ モジュールをメモリ上に読み込む(読み込まないと中身が見えないため)
DoCmd.OpenModule strModuleName
‘ モジュール内の各行を走査
With Modules(strModuleName)
For i = 1 To .CountOfLines
strLine = .Lines(i, 1)
‘ キーワードが含まれていたらイミディエイトウィンドウに出力
If InStr(1, strLine, targetKeyword, vbTextCompare) > 0 Then
Debug.Print “発見: ” & strModuleName & ” (行:” & i & “)”
Debug.Print ” 内容: ” & Trim(strLine)
End If
Next i
End With
‘ 閉じてメモリを解放(これを忘れるとパフォーマンス低下の元です)
DoCmd.Close acModule, strModuleName, acSaveNo
Next objModule
Debug.Print “— 検索完了 —”
End Sub
—
3. なぜ「DoCmd.OpenModule」が必要なのか?
初心者が必ず躓くのが、「モジュールを開かないと中身が取れない」という仕様です。
VBAのコードは、Accessの内部では「テキスト」ではなく「コンパイルされたバイナリに近い状態」で管理されています。`Modules`コレクションにアクセスするためには、一度対象をメモリ上に展開(OpenModule)しなければなりません。
【注意点】
処理が終わったら必ず `DoCmd.Close` してください。開いたままにするとメモリを圧迫し、Accessが極端に重くなる「VBAあるある」の地雷を踏むことになります。
—
4. 陥りやすいエラーと回避策
① 「コンパイルエラー:ユーザー定義型は定義されていません」
これは参照設定が不足している場合によく起こります。`Microsoft Visual Basic for Applications Extensibility 5.3` を参照設定に追加してください。より深い解析(VBAコードの構造そのものを操作する)を行う場合に必須となります。
② 解析対象が多すぎてフリーズする
大規模なシステム(数万行クラス)を一度に全走査すると、Accessは悲鳴を上げます。
- 対策: `DoEvents` をループ内に挟みましょう。OSに処理を譲ることで、フリーズを防ぎ、強制終了の機会も確保できます。
—
5. 次のステップ:保守ツールへの昇華
ここまでのコードを習得すれば、あなた自身で以下のようなツールが作れるようになります。
- デッドコード検出器: 全モジュールで一度も呼び出されていない関数をリストアップする。
- 命名規則チェッカー: 命名規則(例:`btn_`で始まるべきボタン)に違反している箇所を自動抽出する。
- 依存関係グラフの構築: どのフォームがどの標準モジュールを呼んでいるかを可視化する。
—
先輩エンジニアからのメッセージ
VBAは単なる「自動化のためのスクリプト」ではありません。Accessという巨大なデータベース・アプリケーションを制御するための強力な「設計図」そのものです。
今日紹介した `CurrentProject.AllModules` を使いこなす力は、単なるプログラミングスキルの向上を超えて、「システム全体を俯瞰して管理するアーキテクトの視点」を養う第一歩です。
まずはこのコードを標準モジュールにコピペして、自分のシステムがどう動いているのか、覗いてみてください。そこには、今まで知らなかった「コードの美しい構造」が広がっているはずですよ。
ここをクリアすれば、あなたはもう脱・初級者。自信を持って、次の開発へ進んでくださいね!
