Accessを「ゴミ屋敷」にしない!フォーム終了時のスマートな後始末術
こんにちは。現場で泥臭い自動化と格闘し続けてきたエンジニアです。
Accessを使って業務アプリを作っていると、一時的な計算結果を保存するために「一時テーブル」や「一時クエリ」を作りたくなる場面がありますよね。しかし、「作りっぱなし」にしてデータベースを閉じると、Accessはどんどんメタボになり、動作が重くなり、最悪の場合はファイルが壊れます。
今日は、フォームを閉じる瞬間に、作成した一時オブジェクトを「なかったこと」にする、プロフェッショナルな後始末の方法を伝授します。ここをマスターすれば、あなたのAccessは驚くほど軽快で安定したものになりますよ。
—
なぜ「Unload」イベントなのか?
Accessには「Close」や「Unload」といった似たようなイベントがありますが、リソースの後始末には`Unload`イベントを使いましょう。
- Unloadイベント: フォームが閉じられる「直前」に発生します。まだフォームのオブジェクトはメモリ上に存在するため、確実に「自分自身の処理で何を作ったか」を追いかけることができます。
—
実践:一時オブジェクトをクリーンアップするVBAコード
今回は、「処理のたびに一時テーブルを作って、終わったら消す」という王道パターンを実装します。
Private Sub Form_Unload(Cancel As Integer)
‘ 【目的】フォームを閉じる際に、生成した一時オブジェクトを抹消する
Dim db As DAO.Database
Set db = CurrentDb
On Error Resume Next ‘ エラーが発生しても処理を止めない(既に削除済み等の場合)
‘ 1. 一時テーブルの削除
‘ TableExistsのような関数で存在確認してから削除するのがベストですが、
‘ シンプルに「Drop Table」を投げるのが最も確実です
db.Execute “DROP TABLE tmp_ProcessingData”, dbFailOnError
‘ 2. 一時クエリの削除
‘ QueryDefsコレクションから削除します
db.QueryDefs.Delete “qry_TempCalculation”
‘ 後始末の鉄則:オブジェクト変数の解放
Set db = Nothing
On Error GoTo 0 ‘ エラー制御を元に戻す
End Sub
コードのここがポイント!
1. `On Error Resume Next` の意図:
「そもそもテーブルが作られていない」時にコードが走ると、Accessは「そんなものありません!」とエラーを吐いて止まってしまいます。後始末は「あれば消す、なければ何もしない」という寛容さが必要なんです。
2. `db.Execute` の真価:
マクロの記録で生成される `DoCmd.RunSQL` は警告ダイアログが出ますが、`db.Execute` は背後で黙々と処理を実行します。UIを汚さないのがプロの流儀です。
3. `Set db = Nothing`:
これを忘れるエンジニアは多いですが、メモリリークの原因になります。使い終わったものは必ず「帰宅」させてあげましょう。
—
初学者が陥りやすい「3つの罠」
1. テーブル名が重複する「競合の罠」
「`tmp_Table`」という名前で固定すると、複数人が同時に同じファイルを開いた時に地獄を見ます。
- 対策: `tmp_Table_ユーザー名_日時` のように、少しだけ名前をユニークにすると安全です。
2. 「閉じる」ボタン以外で終了される罠
フォームの右上の「×」ボタンは `Unload` を通りますが、強制終了やクラッシュは防げません。
- 考え方: 完璧なクリーンアップは難しいです。だからこそ、アプリ起動時に「`tmp_`で始まるテーブルを全削除する」という「起動時掃除スクリプト」を組んでおくと、二重の守りになります。
3. CurrentDbの乱用
コード内で `CurrentDb` を何度も呼び出すと、Accessは毎回データベース構造を再スキャンします。上記の例のように、一度変数 `db` に格納して使い回すのが、パフォーマンス向上の秘訣です。
—
最後に:美しいシステムは「引き際」が肝心
プロの仕事とアマチュアの仕事の違いは、「どれだけ綺麗に去ることができるか」に現れます。
「作って動かして終わり」ではなく、「去る時に元の姿に戻してあげる」。この意識を持つだけで、あなたのAccessアプリは他の誰が触っても文句が出ない、美しい資産へと進化します。
今回のコードを、まずはあなたのフォームの `Unload` イベントに貼り付けてみてください。Accessが「ふぅ、軽くなった!」と喜んでいるのが感じられるはずですよ。
また何か詰まったら、いつでも聞きに来てくださいね。あなたの開発ライフがより良いものになるよう、応援しています!
