【実務・中級編】フォームの「Dirty」プロパティを監視して未保存データの破棄を制御する – Access VBA解析バイブル

スポンサーリンク

Access VBAを掌握する:Dirtyプロパティで制御する「未保存データ」の防波堤

Access開発において、初心者が最初に躓くのが「勝手に保存されるレコード」の恐怖だ。フォームを閉じた瞬間、あるいは別のレコードへ移動した瞬間、意図しないデータがデータベースを汚染する。これを防ぐための鍵は、Accessのオブジェクトモデルにおける`Dirty`プロパティをいかに「制御」するかにかかっている。

今回は、業務システムにおける「データの整合性」と「ユーザー体験」を両立させる、極限の排他制御テクニックを伝授する。

なぜ「Dirty」を監視しなければならないのか?

`Dirty`プロパティは、フォームの現在のレコードが最後に保存されてから変更されたかどうかを示す、Accessの魂とも言えるフラグだ。

多くの開発者は、`DoCmd.Close`を呼ぶだけで済ませてしまうが、これではユーザーの「しまった、編集を取り消したい」という要求に応えられない。「保存するか、破棄するか」の決定権をシステムが握り、ユーザーに選択させること。これが、堅牢な業務アプリケーションの絶対条件だ。

堅牢な実装のためのアーキテクチャ

単に`Me.Undo`を呼ぶだけでは不十分だ。以下の設計思想を頭に刻んでほしい。

1. BeforeUpdateイベントの掌握: 保存の直前(DirtyがTrueの状態で)にバリデーションを挟む。
2. Unloadイベントでの制御: フォームが閉じられる瞬間、強制的に未保存状態をチェックし、必要なら破棄(Undo)させる。
3. グローバルなUndoの徹底: ユーザーによる「戻る」操作をシステム側で明示的にハンドリングする。

実践:プロダクションレベルのコード例

以下のコードは、フォームが閉じられる際に変更があれば確認を行い、破棄を選択すれば確実にロールバックさせる実装例だ。

Option Compare Database
Option Explicit

”’

”’ フォームが閉じられる直前の制御
”’ 未保存の変更がある場合、ユーザーに破棄の意志を確認する
”’

Private Sub Form_Unload(Cancel As Integer)
‘ Dirtyプロパティは、レコードに未保存の変更がある場合のみTrueになる
If Me.Dirty Then
Dim response As VbMsgBoxResult

response = MsgBox(“データが変更されています。変更を破棄して終了しますか?” & vbCrLf & _
“(「いいえ」を選択すると、編集中の内容を保存して閉じます)”, _
vbYesNoCancel + vbQuestion, “確認”)

Select Case response
Case vbYes
‘ 変更を破棄(Undo)
Me.Undo
Case vbNo
‘ 何もしない(Accessが自動的に保存を行う)
Case vbCancel
‘ 終了処理をキャンセル
Cancel = True
End Select
End If
End Sub

”’

”’ ボタン操作によるキャンセル用メソッド
”’ ユーザーが明示的に「編集を破棄」したい場合に使用
”’

Public Sub CancelChanges()
If Me.Dirty Then
If MsgBox(“変更を破棄しますか?”, vbYesNo + vbExclamation) = vbYes Then
Me.Undo
‘ Undo後のフォーカス制御は必須
DoCmd.RunCommand acCmdRecordsGoToNew
End If
End If
End Sub

現場で「バグ」を生むな:エンジニアへの教訓

この設計において、注意すべき点が2つある。

  • Undo後のフォーカス: `Me.Undo`を実行した直後、フォームのステータスは「新規レコード」あるいは「クリーンな状態」に戻る。このとき、フォーカスがどこにあるかを意識しないと、ユーザーは次に何をすればいいか迷子になる。必要であれば`Me.Requery`や`DoCmd.GoToRecord`で状態をリセットせよ。
  • トランザクションとの対比: `Dirty`プロパティはあくまでフォームレベルのバッファリングである。もし、フォーム経由ではなくVBAから`CurrentDb.Execute`で直接データを操作する場合、`Dirty`は役に立たない。その場合はDAOの`BeginTrans` / `CommitTrans` を検討すべきだが、フォームのDirty制御と混同してはならない。

最後に:自動化の真髄

「コードを書くこと」は目的ではない。「ユーザーが操作を誤っても、データベースが壊れないようにすること」こそが、我々エンジニアに課せられた使命だ。

`Dirty`プロパティを監視することは、ユーザーに対する「思いやり」をコードに落とし込むことと同義だ。この設計を標準搭載したフォームを構築すれば、あなたの作るツールは、現場の担当者から「なぜか使いやすく、エラーが起きない」と信頼されるはずだ。

さあ、今すぐあなたのAccessプロジェクトにこのロジックを組み込み、その安定性を体感してほしい。

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