【入門編】Application.GetOptionで「名前の自動修正」機能をVBAから一時的に無効化する – Access VBA解析バイブル

スポンサーリンク

こんにちは!Access VBAの世界へようこそ。
日々、大量のデータを相手に奮闘していることと思います。「マクロの記録」から一歩踏み出し、自分の手でコードを書いてシステムをコントロールする面白さを感じ始めている頃ではないでしょうか。

今回は、実務で絶対に知っておくべき「Accessの隠れたパフォーマンス泥棒」を退治する方法をお伝えします。

ここをクリアすれば、Access VBAの基本とオブジェクトモデルの神髄がグッと身近になりますよ。一緒にバッチリマスターしていきましょう!

1. なぜ、大量データ処理でAccessは急に遅くなるのか?

皆さんは、VBAを使って大量のレコードを追加したり、テーブルの設計をプログラムから変更したりしたことはありませんか?
「たった数千件のデータなのに、やけに処理に時間がかかるな…」と感じたなら、それは犯人が決まっています。

その犯人の名は「名前の自動修正(Name AutoCorrect)」です。

「名前の自動修正」という名の過保護な機能

Accessには、フォームやレポート、クエリなどで使っているフィールド名やテーブル名を変更したとき、関連する他のオブジェクトも自動的に名前を書き換えてくれる、一見すると親切な機能があります。これが「名前の自動修正」です。

しかし、この機能、裏側で常にAccessに監視の目を光らせています。
特にVBAから大量のテーブル操作やクエリの動的生成を行うとき、この監視が猛烈なオーバーヘッド(余計な負荷)となり、処理スピードを極端に落としてしまうのです。

「いや、今はそんなお節介はいらないから、とにかく爆速で処理を終わらせてくれ!」
そう叫びたくなる場面で、VBAからこの機能を一時的に無効化するテクニックが今回のお題です。

2. 解決の鍵:`Application.GetOption` と `SetOption`

Accessのオプション画面([ファイル] > [オプション] > [現在のデータベース] にある設定)は、実はVBAから自由に読み書きができます。

ここで登場するのが、今回の主役である`Application`オブジェクトです。

  • `Application.GetOption(“設定項目名”)`

現在の設定値がどうなっているかを「取得」します。

  • `Application.SetOption “設定項目名”, 値`

設定値を強制的に「変更」します。

これらを組み合わせることで、「処理の直前に名前の自動修正をオフにし、処理が終わったら元の状態に戻す」という、安全でスマートなコードが書けるようになります。

3. 実践!爆速化を実現するVBAコード

それでは、実際の現場でそのままコピペして使えるサンプルコードを見てみましょう。
今回は、処理の前後で設定を退避・復元する「プロフェッショナルな作法」で記述しています。

Option Compare Database
Option Explicit

Public Sub ExecuteHighSpeedProcess()
‘ =========================================================================
‘ 目的: 大規模データ処理の前に「名前の自動修正」を無効化し、処理後に復元する
‘ 執筆者: チーフアーキテクト
‘ =========================================================================

Dim originalAutoCorrect As Long

On Error GoTo ErrorHandler ‘ エラー時にも設定を戻せるようにする保険

‘ —————————————————————–
‘ 1. 現在の「名前の自動修正」の設定状態を退避しておく
‘ —————————————————————–
‘ Accessのオプション名文字列で現在の状態を取得します (0 = 無効, -1 = 有効)
originalAutoCorrect = Application.GetOption(“Name AutoCorrect Save”)

‘ —————————————————————–
‘ 2. 「名前の自動修正」を一時的に無効 (0) に設定する
‘ —————————————————————–
Application.SetOption “Name AutoCorrect Save”, 0

‘ ※おまけ:「名前の自動修正の名前のログ記録」もオフにするとさらに効果的
Dim originalLog As Long
originalLog = Application.GetOption(“Name AutoCorrect Log”)
Application.SetOption “Name AutoCorrect Log”, 0

Debug.Print “【最適化】名前の自動修正機能を一時的にオフにしました。”

‘ —————————————————————–
‘ 3. ここに重たい処理(大量のテーブル操作やSQL実行など)を書く
‘ —————————————————————–
Dim db As DAO.Database
Set db = CurrentDb

‘ 例:ダミーの重たい処理(実際にはここにINSERT文やテーブル作成などが入ります)
‘ db.Execute “DUMMY_QUERY”, dbFailOnError

MsgBox “大量データの処理が完了しました!”, vbInformation, “高速化完了”

ErrorHandler:
‘ —————————————————————–
‘ 4. 【最重要】処理が成功しても失敗しても、必ず設定を元の状態に戻す
‘ —————————————————————–
Application.SetOption “Name AutoCorrect Save”, originalAutoCorrect
Application.SetOption “Name AutoCorrect Log”, originalLog

Debug.Print “【復元】名前の自動修正機能を元の設定に戻しました。”

If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If

End Sub

コードのここがポイント!

1. 設定のバックアップ (`originalAutoCorrect`)
いきなり設定をOFFにするのではなく、ユーザーが元々設定していた状態(ONだったのかOFFだったのか)を変数に記憶させておくのが、エンジニアとしての優しいマナーです。
2. エラーハンドリング (`On Error GoTo ErrorHandler`)
もし処理の途中でエラーが起きてコードが止まってしまった場合、設定がOFFのまま放置されてしまいます。それを防ぐために、必ず`ErrorHandler`ラベルを通るように設計し、最後に必ず元の設定を復元させています。

4. 陥りやすい罠と注意点

初心者のうちは、次のようなミスでハマりがちです。気をつけておきましょう!

  • オプション名のスペルミス

`GetOption` や `SetOption` の引数に渡す文字列(`”Name AutoCorrect Save”`など)は、一文字でも間違えると実行時エラーになります。Accessのバージョンによって内部名が微妙に異なる場合もあるため、必ず事前にイミディエイトウィンドウなどでテストしてください。

  • エラー時の復元忘れ

先ほども触れましたが、「エラーで止まったら設定が戻らなかった」という状態になると、後から他の開発者(あるいは未来の自分)が「あれ、なんか設定が変わってる!?」とパニックになります。`On Error` による確実な復元はセットで覚えましょう。

まとめ

今回は `Application.GetOption` を使って、「名前の自動修正」をVBAからコントロールし、パフォーマンスを劇的に改善する手法を解説しました。

  • 大規模データ処理の前には 自動修正をOFFにする
  • 処理が終わったら 必ず元の設定に戻す(エラー時も含む)

この基本マインドとオブジェクトモデルの操作をマスターすれば、あなたの書くAccess VBAは見違えるほど堅牢でプロフェッショナルなものになります。

ここをクリアできれば、もうAccess VBAの基礎はバッチリです!
ぜひ次の開発案件でこのテクニックを取り入れて、サクサク動く快適なシステムを作ってみてくださいね。それでは、また次の極限知見でお会いしましょう!

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