こんにちは!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の基礎はバッチリです!
ぜひ次の開発案件でこのテクニックを取り入れて、サクサク動く快適なシステムを作ってみてくださいね。それでは、また次の極限知見でお会いしましょう!
