【入門編】フォームの「Unload」イベントで実行する、一時的なリソース(一時テーブル・クエリ)のクリーンアップ – Access VBA解析バイブル

スポンサーリンク

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が「ふぅ、軽くなった!」と喜んでいるのが感じられるはずですよ。

また何か詰まったら、いつでも聞きに来てくださいね。あなたの開発ライフがより良いものになるよう、応援しています!

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