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

スポンサーリンク

Access VBAの深淵へ:Dirtyプロパティで「意図せぬ保存」を完璧に封じ込める技術

こんにちは。現場の最前線でAccessと格闘し続けるエンジニアです。

Accessを使っていて、こんな「恐怖」を感じたことはありませんか?
「フォームに入力している途中で、うっかりEnterキーを押したり、閉じるボタンを触ってしまい、中途半端なデータが勝手に保存されてしまった…」

これは、Accessの「レコード移動時に自動保存される」という親切すぎる仕様が原因です。しかし、業務システムではこの「親切」が時に「事故」を生みます。

今日は、Access VBAの心臓部である`Dirty`プロパティを掌握し、データの生死をあなたの指先ひとつで制御するテクニックを伝授します。ここをクリアすれば、あなたはもうマクロの記録を卒業し、「システムエンジニア」の入り口に立ったと言っても過言ではありません。

1. 「Dirty」とは何か?――Accessの意思を読み解く

`Dirty`(ダーティ)は、直訳すれば「汚れた」ですが、Accessの世界では「未保存の変更がある(編集中の状態)」ことを意味します。

  • Dirty = True: ユーザーがデータを書き換えたが、まだテーブルに反映されていない状態。
  • Dirty = False: 変更がない、または保存が完了した「クリーン」な状態。

フォームの`Dirty`プロパティを監視すれば、「今、このデータは保存すべきか、それとも捨てるべきか」をVBAで判定できるようになります。

2. 実践:未保存データの破棄を制御する

「編集をキャンセルして元の状態に戻す」には、`Me.Undo`メソッドを使います。これと`Dirty`を組み合わせるのが、プロの定石です。

以下のコードは、フォームの「閉じるボタン」に仕込む想定のコードです。

Private Sub btnClose_Click()
‘ フォームが「Dirty(編集中)」かどうかを判定
If Me.Dirty Then
‘ ユーザーに確認を求める
If MsgBox(“編集中のデータがありますが、破棄して閉じますか?”, vbYesNo + vbQuestion) = vbYes Then
‘ 変更をなかったことにする(Dirtyを強制的にFalseにする)
Me.Undo
Else
‘ 保存させたい場合は、処理を中断して入力を継続させる
Exit Sub
End If
End If

‘ フォームを閉じる
DoCmd.Close acForm, Me.Name
End Sub

コードのポイント

  • `If Me.Dirty Then`: この一行が命綱です。編集されていないなら確認画面すら出す必要はありません。無駄なクリックをユーザーに強いるのは、優れたUIとは言えませんからね。
  • `Me.Undo`: これは魔法のコマンドです。`Dirty`状態の変更を即座に破棄し、レコードを「保存前」のクリーンな状態に巻き戻します。

3. 陥りやすい罠:イベントの連鎖に注意せよ

初学者が必ずハマるのが、「保存しようとすると、また保存確認が出て無限ループする」という現象です。

これは、`BeforeUpdate`イベントで`Cancel = True`を使いすぎた時に起こります。`BeforeUpdate`は「保存される直前」に走るイベントです。ここで無理やり保存を止めようとすると、Accessの内部的なデータ整合性のフローと喧嘩してしまうのです。

極意:
「保存の制御」は`BeforeUpdate`でやるよりも、「保存ボタン(または閉じるボタン)」という明示的なトリガーで行うのが、最もバグが少なく、ユーザーにとっても親切です。

4. さらに上を目指すあなたへ:フォームの「一括管理」

もし、フォームが10個も20個もある場合、すべてのボタンに同じコードを書くのは非効率ですよね。そんな時は、標準モジュールに「共通のキャンセル関数」を作成し、それを呼び出すようにしましょう。

‘ 標準モジュールに記述
Public Sub ForceCancel(frm As Form)
If frm.Dirty Then
frm.Undo
End If
End Sub

このように、「対象(フォームオブジェクト)」を引数として渡す書き方は、保守性の高いシステムを作るための第一歩です。

最後に:Accessエンジニアとして大切なこと

Accessのフォームを触っていると、つい「Accessが勝手にやってくれること」に甘えてしまいがちです。しかし、「何がいつ保存されるのか」をあなたが完全に支配下におくだけで、システムの信頼性は劇的に向上します。

`Dirty`プロパティを理解したあなたは、もうAccessに振り回されることはありません。次は、`CurrentDb`を使ったレコードセットの操作や、SQLによるデータ更新へと視野を広げてみてください。

あなたのAccessライフが、より快適で、バグのないものになることを心から願っています。何かわからないことがあれば、またいつでも聞きに来てくださいね。

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