【入門編】【上級】Application.CurrentProject.AllModulesを活用した、VBAコードの動的解析と保守ツール開発 – Access VBA解析バイブル

スポンサーリンク

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` を使いこなす力は、単なるプログラミングスキルの向上を超えて、「システム全体を俯瞰して管理するアーキテクトの視点」を養う第一歩です。

まずはこのコードを標準モジュールにコピペして、自分のシステムがどう動いているのか、覗いてみてください。そこには、今まで知らなかった「コードの美しい構造」が広がっているはずですよ。

ここをクリアすれば、あなたはもう脱・初級者。自信を持って、次の開発へ進んでくださいね!

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