【実務・中級編】【上級】Application.GetOptionで「名前の自動修正」機能をVBAから一時的に無効化するリスク回避術 – Access VBA解析バイブル

スポンサーリンク

【Accessの闇を統べる】「名前の自動修正」をVBAで制御し、データベースの寿命を延ばす最適解

Access開発において、多くのエンジニアが「なぜかmdb/accdbが異常に肥大化する」「意図しないところで依存関係が壊れる」という悪夢に遭遇する。その元凶の筆頭が、Microsoftが親切心で実装した機能、「名前の自動修正(Name AutoCorrect)」だ。

これは、オブジェクトの名前を変更した際に、それに関連するクエリやフォームの参照先を自動で追従・修正してくれる機能だが、裏側では「名前の自動修正情報」という名の巨大なゴミがシステムテーブルに蓄積され続ける。これがデータベースを破壊し、パフォーマンスを腐敗させる。

本稿では、この「名前の自動修正」をVBAで完全に掌握し、安全かつ堅牢な運用を実現する極限のテクニックを伝授する。

なぜ「名前の自動修正」は悪なのか?

1. 肥大化の加速: 些細な変更のたびにシステムテーブル(`MSysNameMap`等)が膨れ上がり、ファイルサイズを肥大化させる。
2. パフォーマンスの劣化: クエリ実行のたびにエンジンが依存関係の整合性を確認し、クエリプランの最適化を阻害する。
3. 予期せぬ副作用: 意図しない箇所まで修正が波及し、コンパイルエラーすら出ずに論理バグを埋め込む。

プロフェッショナルな環境では、この機能は「開発中はON、運用中およびデータ処理時はOFF」にするのが鉄則だ。

実装:Application.GetOptionによる制御

`Application.GetOption`および`SetOption`メソッドを用いることで、この機能をVBAから制御できる。しかし、ただOFFにするだけでは不十分だ。エラー発生時や予期せぬ終了時に設定が戻らないリスクを考慮し、「自動復帰」を保証する設計が不可欠である。

プロダクションコード:AutoCorrectManagerクラス

以下のコードを標準モジュールに配置し、重い処理の前後で呼び出すことで、安全に機能を一時停止させることが可能だ。

Option Compare Database
Option Explicit

‘ 「名前の自動修正」を制御するユーティリティ
‘ 常にこのクラスを介して設定を変更し、状態の不整合を防ぐ
Public Sub SafeRunAction(ByRef pAction As Object, Optional ByVal disableAutoCorrect As Boolean = True)
Dim originalState As Boolean

‘ 現在の状態を退避
originalState = Application.GetOption(“Name AutoCorrect”)

On Error GoTo Cleanup

If disableAutoCorrect Then
‘ 処理のために無効化
Application.SetOption “Name AutoCorrect”, False
End If

‘ 実行したい処理をコール(必要に応じて引数を拡張すること)
‘ ここでは例として呼び出し先で何らかの重い処理を行う
pAction.Execute

Cleanup:
‘ 処理終了後、必ず元の状態に戻す(エラー発生時も保証)
Application.SetOption “Name AutoCorrect”, originalState

If Err.Number <> 0 Then
MsgBox “エラーが発生しましたが、設定は正常に復帰しました: ” & Err.Description, vbCritical
End If
End Sub

運用上の極意:コピペで終わらせない「設計の注意点」

単にこのコードを貼るだけでは、真のエンジニアとは言えない。以下の点に留意せよ。

1. 開発環境と配布環境の切り分け

開発時には、この機能を有効にして「名前変更時の追従」を利用するメリットがある。しかし、配布用データベース(フロントエンド)をビルドする直前には、必ずこの機能をOFFにした状態で「最適化」を実行すること。 これにより、不要なメタデータがパージされる。

2. インポート処理との親和性

外部からテーブルをインポートする際、この機能がONだと、不要なメタデータが大量に生成される。大量のデータインポートやテーブル作成クエリを走らせる直前には、必ず上記の`SafeRunAction`を通す設計にせよ。

3. エラーハンドリングの徹底

`SetOption`は強力だが、Accessの動作設定を直接書き換える。もし、処理中にVBAがクラッシュした場合、設定が「無効」のまま残る可能性がある。必ず`On Error GoTo`による保護を怠ってはならない。

最後に:Accessを使いこなすということ

Accessは、設計次第で「玩具」にも「業務を支える堅牢なプラットフォーム」にもなり得る。
「名前の自動修正」のような隠れた設定を把握し、自身のコードで制御下に置くことは、単なるコーディングスキルを超えた、システムの挙動を支配するアーキテクトの矜持そのものだ。

データベースが重い、挙動が不安定だ。そう嘆く前に、まずはこの設定を疑え。そして、自らの手でAccessの「肥大化」という病を根治させるのだ。

健闘を祈る。

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