【入門編】Application.VBEオブジェクトで「モジュール内のコード」を検索・置換するリファクタリング支援ツール – Access VBA解析バイブル

スポンサーリンク

こんにちは! Accessでの開発、日々お疲れ様です。

「昔作った巨大なデータベース、あちこちに同じフィールド名や関数名が散らばっていて、名前を一つ変えるだけでも一苦労……」
そんな絶望感を味わったことはありませんか?

マクロの記録すらないAccessの世界では、コードのメンテナンスやリファクタリング(整理整頓)は手作業になりがちです。しかし、実はVBA自身にVBAのコードを書かせ、書き換えさせるという、ちょっと魔法のようなアプローチが存在します。

今回は、Accessの心臓部である `Application.VBE` オブジェクトを使い、モジュール内のコードを自動で検索・置換する「リファクタリング支援ツール」の作り方を、優しく徹底解説していきます。

ここをクリアすれば、あなたも「マクロの記録から脱却した真のAccessエンジニア」の仲間入りです。一緒に本質をマスターしていきましょう!

1. なぜ `CurrentDb` ではなく `Application.VBE` なのか?

普段、Access VBAを書くときによく使うのは `CurrentDb` ですよね。これは「テーブルやクエリなどのデータ(オブジェクト)」を操作するためのものです。

しかし、今回私たちが操作したいのは「コード(VBAのプログラムそのもの)」です。
データとプログラムは、Accessという家の中でも住んでいる部屋が違います。

  • データの部屋(DAO / ADO): テーブル、クエリ、フォームのレイアウトなど
  • プログラムの部屋(VBE – Visual Basic Editor): 標準モジュール、クラスモジュール、フォームのコードなど

プログラムの部屋の鍵を開け、中のコードを読み書きするためのマスターキーが、`Application.VBE`(Visual Basic for Applications Environment) オブジェクトなのです。

2. 開発の前に:絶対に必要な「セキュリティの設定」

`Application.VBE` を使ってコードを操作するためには、Accessに対して「VBAプロジェクトへのアクセスを許可するよ」とあらかじめ伝えておく必要があります。これを忘れると、VBAからVBAを触ることはセキュリティ上、頑なに拒否されてしまいます。

⚠️ 必須の事前準備

1. Accessを開き、[ファイル] > [オプション] > [トラスト センター] を開きます。
2. [トラスト センターの設定] ボタンをクリックします。
3. [マクロの設定] で、「VBA プロジェクトへのプログラムによるアクセスを信頼する」 にチェックを入れます。

この設定が完了したら、いよいよコードの実装に入りましょう!

3. 実装:モジュール内を一括検索・置換するツール

今回は、特定の標準モジュールやフォームモジュールの中身を巡回し、指定したキーワードを別のキーワードに一括置換するプロシージャを作成します。

以下のコードを、適当な標準モジュールに貼り付けてみてください。

Option Explicit

‘ =====================================================================
‘ VBEを使ったコード一括置換ツール
‘ ※実行前に必ずデータベースのバックアップを取ってください!
‘ =====================================================================
Public Sub ExecuteRefactoringSearchReplace()
Dim targetKeyword As String
Dim replaceKeyword As String

‘ 1. ユーザーから検索ワードと置換ワードを取得
targetKeyword = InputBox(“検索するキーワード(関数名や変数名など)を入力してください:”, “VBEリファクタリング – 検索”)
If targetKeyword = “” Then Exit Sub

replaceKeyword = InputBox(“置換後のキーワードを入力してください:” & vbCrLf & “※空欄にすると削除になります”, “VBEリファクタリング – 置換”, targetKeyword)

‘ 2. 確認メッセージ
If MsgBox(“プロジェクト内の全モジュールから ‘” & targetKeyword & “‘ を ‘” & replaceKeyword & “‘ に置換します。” & vbCrLf & “よろしいですか?”, _
vbYesNo + vbExclamation, “実行確認”) <> vbYes Then
Exit Sub
End If

‘ 3. VBEによる置換処理の実行
Call ReplaceCodeInVBE(targetKeyword, replaceKeyword)

MsgBox “リファクタリングが完了しました! VBEウィンドウを開いて確認してください。”, vbInformation, “完了”
End Sub

‘ ———————————————————————
‘ VBEのコンポーネントを走査してコードを置換する核心ロジック
‘ ———————————————————————
Private Sub ReplaceCodeInVBE(ByVal findStr As String, ByVal repStr As String)
Dim vbProj As Object ‘ VBProject
Dim vbComp As Object ‘ VBComponent
Dim codeMod As Object ‘ CodeModule

Dim startLine As Long
Dim numLines As Long
Dim codeText As String
Dim isReplaced As Boolean

‘ 現在のAccessファイルのVBAプロジェクトを取得
Set vbProj = Application.VBE.ActiveVBProject

isReplaced = False

‘ プロジェクト内のすべてのコンポーネント(標準モジュール、フォーム、レポート等)をループ
For Each vbComp In vbProj.VBComponents
Set codeMod = vbComp.CodeModule

‘ モジュールの総行数を取得
numLines = codeMod.CountOfLines

If numLines > 0 Then
‘ モジュール全体のコードを一括して文字列として取得
‘ (Lines(1, numLines) で先頭から末尾まで一気に取得できます)
codeText = codeMod.Lines(1, numLines)

‘ キーワードが含まれているかチェック
If InStr(1, codeText, findStr, vbTextCompare) > 0 Then

‘ 文字列置換を実行
codeText = Replace(codeText, findStr, repStr, 1, -1, vbTextCompare)

‘ モジュール全体のコードを一度クリアして、書き換えたコードを流し込む
‘ ※これによって安全かつ確実にコードを置き換えます
codeMod.DeleteLines 1, numLines
codeMod.AddFromString codeText

Debug.Print “置換成功: ” & vbComp.Name
isReplaced = True
End If
End If
Next vbComp

If Not isReplaced Then
MsgBox “指定されたキーワードはどのモジュールにも見つかりませんでした。”, vbInformation
End If
End Sub

4. コードの解説:ここがエンジニアの技術的ポイント!

初心者の方に向けて、このコードの最も重要で美しいポイントを解説します。

① `Application.VBE.ActiveVBProject`

これがVBEの世界への入り口です。「今、自分が開いているAccessファイルの中にあるVBAプロジェクト全体」をオブジェクトとして掴まえています。

② `VBComponents` と `CodeModule`

Accessの中には、いくつもの「部品(モジュール、フォーム、レポート)」があります。これを `For Each` で一つずつめくっていくのが `vbProj.VBComponents` です。
そして、個々のモジュールの「コードが書かれているエディタ画面そのもの」を表現するのが `CodeModule` です。

③ `Lines` で全取得して `AddFromString` で流し込む(ここが極意!)

VBEのコードを1行ずつ書き換えるのは、パフォーマンス的にもエラー処理的にも非常に面倒でバグの温床になります。
そこで、このコードでは以下のスマートな手法をとっています。
1. `codeMod.Lines(1, numLines)` で、モジュールのコードを丸ごと変数(文字列)に吸い上げる
2. VBAの `Replace` 関数で、メモリ上で一瞬にして文字を置き換える
3. `codeMod.DeleteLines` で古いコードを全部消し、`codeMod.AddFromString` で新しいコードを丸ごと書き戻す

この「丸ごと吸い上げて、書き換えて、丸ごと戻す」というアプローチをとることで、コードの改行崩れや行番号のズレといったトラブルを完全に回避できます。プログラミングの現場でよく使われる、極めて安全でスマートな手法です。

5. 陥りやすいエラーと注意点

最後に、現場で開発する際に必ず直面する「罠」について共有しておきます。

  • 「変数が定義されていません」エラーが出る
  • 原因:今回はVBE関連の高度なオブジェクト(`VBProject` や `VBComponent` 等)をあえて `Object` 型(遅延バインディング)で宣言しています。もし型を厳密に定義したい場合は、VBEの参照設定で 「Microsoft Visual Basic for Applications Extensibility 5.3」 にチェックを入れる必要があります。今回は初心者向けに参照設定不要で動く `Object` 型を採用しています。
  • 元に戻せない(Undoが効かない)
  • `AddFromString` でコードを書き換えると、VBE側の「Ctrl + Z(元に戻す)」の履歴がクリアされてしまいます。そのため、実行する前に必ずデータベース(accdbファイル)のバックアップを必ずコピーして保存してください。 これはエンジニアの鉄則です。

まとめ

いかがでしたか?
今回は、`Application.VBE` を使ってモジュール内のコードを自動検索・置換するリファクタリングツールをご紹介しました。

「VBAでVBAを操る」という感覚を掴めると、Accessを使ったシステム開発の自動化の幅は一気に何倍にも広がります。単なる「マクロの延長」から、「システムをプログラミングするエンジニア」へとステップアップできた瞬間です。

ぜひ現場で活用し、面倒な手作業から解放されてくださいね。あなたのAccess開発ライフがより快適になることを応援しています!

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