こんにちは! 現場でバリバリ動くAccessシステムを作っていると、こんな壁にぶぶつかったことはありませんか?
「前任者が作ったこの巨大なAccess、どのモジュールに何の処理が書いてあるんだ……?」
「システム全体で、この古い関数(変数)が使われている場所を一発で特定したい!」
何万行もあるコードの海から、目当てのプロシージャを探すために、一つずつVBE(Visual Basic Editor)を開いてCtrl + Fで検索……なんて非効率なことは、もう終わりです。
今回は、Accessが持つ隠しコマンドのような強力なオブジェクト`Application.CurrentProject.AllModules`を駆使して、データベース内の全コードを自動で解析し、一覧化する「コード保守ツール」の作り方を解説します。
ここをクリアすれば、あなたもAccess VBAの構造を掌の上で操るプロフェッショナルです。優しく、そして本質的なところまで丁寧に紐解いていきましょう!
—
1. なぜ「動的解析ツール」が必要なのか?
Access開発の現場で最も恐ろしいのは「ブラックボックス化」です。
フォームのボタンをクリックしたときに動くマクロ、背後でこっそり走る標準モジュール、レポートのイベント……これらが複雑に絡み合うと、どこを直したらどこに影響が出るのか分からなくなります。
通常、VBAのコードを解析するには人間がVBEを開く必要がありますが、「VBAからVBAのコードを読みに行く(自己言及する)」ことがAccessなら可能です。
これを実現するのが、`Application.CurrentProject.AllModules` というコレクションです。これを使えば、Accessファイル(`.accdb`)の中に眠るすべての標準モジュールやクラスモジュールを、プログラムの力で一網打尽に走査できます。
—
2. 魔法のオブジェクト:`AllModules` と VBComponent
AccessのVBAからコードの中身を覗き見るには、実は2つの世界を行き来する必要があります。
1. Accessの世界 (`CurrentProject.AllModules`):
今開いているデータベースに、どんなモジュールが存在するのかを教えてくれます。
2. VBEの世界 (`VBProject.VBComponents`):
モジュールの中に書かれている「実際のテキスト(ソースコード)」を読み書きする権限を持っています。
この2つを連携させることで、「全モジュールの名前リストを作り、中身のテキストから特定のキーワードを探し出す」という高度な自動化ツールが作れるのです。
—
3. 実装:全モジュール走査&キーワード検索ツール
それでは、実際に現場でそのままコピー&ペーストして使える実用的なコードを公開します。
適当な標準モジュールを新規作成し、以下のコードを貼り付けてみてください。
Option Compare Database
Option Explicit
‘ =====================================================================
‘ 担当者必見!データベース内の全モジュールから特定キーワードを捜索するツール
‘ =====================================================================
Public Sub SearchAllModulesCode()
Dim objModule As AccessObject
Dim vbc As Object ‘ VBIDE.VBComponent
Dim codeModule As Object ‘ VBIDE.CodeModule
Dim searchKeyword As String
Dim lineCount As Long
Dim i As Long
Dim targetLine As String
Dim foundCount As Long
‘ 1. ユーザーに検索したいキーワード(プロシージャ名や変数名)を聞く
searchKeyword = InputBox(“検索したいプロシージャ名やキーワードを入力してください:”, “VBAコード動的解析ツール”, “Sub “)
If Trim(searchKeyword) = “” Then
MsgBox “検索キーワードが入力されなかったため、処理を中断します。”, vbExclamation
Exit Sub
End If
foundCount = 0
Debug.Print “=== 検索開始: [ ” & searchKeyword & ” ] ===”
‘ 2. CurrentProject.AllModules でプロジェクト内の全モジュールをループ
For Each objModule In Application.CurrentProject.AllModules
‘ 注意:フォームやレポートの裏にあるモジュールも取得対象になります
On Error Resume Next
Set vbc = Application.VBE.ActiveVBProject.VBComponents(objModule.Name)
On Error GoTo 0
If Not vbc Is Nothing Then
Set codeModule = vbc.CodeModule
lineCount = codeModule.CountOfLines
‘ 3. モジュール内の全行を上から下までスキャン
For i = 1 To lineCount
targetLine = codeModule.Lines(i, 1)
‘ キーワードが含まれているか判定(大文字小文字を区別しない)
If InStr(1, targetLine, searchKeyword, vbTextCompare) > 0 Then
foundCount = foundCount + 1
‘ イミディエイトウインドウに出力
Debug.Print “【発見】モジュール: ” & objModule.Name & ” (行: ” & i & “)”
Debug.Print ” -> ” & Trim(targetLine)
End If
Next i
End If
Set vbc = Nothing
Next objModule
Debug.Print “=== 検索終了 (計 ” & foundCount & ” 件ヒット) ===”
MsgBox “解析が完了しました!イミディエイトウインドウ(Ctrl + G)を確認してください。”, vbInformation, “完了”
End Sub
—
4. このコードのポイントと「初心者が陥りやすい罠」
先輩エンジニアとして、このコードの重要なポイントと、皆さんがハマりがちなポイントをいくつか解説しておきます。
① 「信頼関係」の壁(セキュリティ設定)
このコードを実行したとき、もし次のようなエラーが出たら慌てずに対処してください。
> 「Visual Basic プロジェクトへのプログラムによるアクセスは信頼されていません」
【解決策】
Accessのオプション画面を開きます。
1. `ファイル` > `オプション` > `トラスト センター` を選択。
2. `トラスト センターの設定` ボタンをクリック。
3. `マクロの設定` 項目にある 「Visual Basic プロジェクトへのアクセスを信頼する」 にチェックを入れてOKを押します。
(※VBAからVBEを操作するためには、このお墨付きが必ず必要になります)
② `On Error Resume Next` の優しさ
フォームやレポートの中には、まだ「コードが1行も書かれていない(モジュールが存在しない)」ものも含まれています。
そのままVBEのコンポーネントを取得しにいこうとするとエラーで止まってしまうため、`On Error Resume Next` で華麗にいなしつつ、安全に存在するものだけを処理するのがプロの技です。
—
5. さらに応用するために:ここから先の世界へ
今回紹介した `Application.CurrentProject.AllModules` と `CodeModule` オブジェクトを組み合わせることで、応用範囲は無限に広がります。
- 自動リファクタリングツール:
古い変数名を一括で新しい変数名に安全に置換するスクリプトを書く。
- ドキュメント自動生成ツール:
すべてのモジュールから `Public Sub` や `Public Function` の行だけを抜き出し、仕様書(Excel等)に自動出力する。
「コードを人間が手で探す」時代はもう終わりです。データベース自体をプログラムで解析・操作できるようになると、Access開発のスピードと品質は劇的に跳ね上がります。
ここをクリアできれば、あなたはもう初級者の枠を大きく超えていますよ。ぜひご自身の開発環境で試してみてくださいね!
