Access VBAの極意:フォームの「保存」を制する者は、データの整合性を制す
こんにちは。Access開発の現場に長く身を置いていると、「なぜかデータが保存されない」「意図しないタイミングでエラーが出る」という相談をよく受けます。その原因のほとんどは、Accessの「バッファリング(一時保存)」の仕組みを理解できていないことにあります。
今回は、Access開発の登竜門でありながら、多くの人が曖昧に使っている`DoCmd.RunCommand acCmdSaveRecord`の正しい作法と、入力チェックの鉄則である`BeforeUpdate`イベントについて解説します。
—
1. なぜ「保存」が必要なのか?(Accessの裏側を知る)
Accessのフォームに入力した値は、すぐにはテーブルに書き込まれません。ユーザーがテキストボックスに入力している間、データは「フォーム上のメモリ」という仮置き場に留まっています。
この「仮置き場」にあるデータを物理的なテーブルに押し込む行為が「保存」です。これをプログラムから強制的に実行するのが `DoCmd.RunCommand acCmdSaveRecord` です。
陥りやすい罠
よくあるのが、ボタンを押した瞬間に「保存」せずに、いきなり別の処理(レポート出力や別フォームへの移動)を走らせるパターンです。これでは、「まだ仮置き場にある最新のデータ」が無視された状態で処理が進んでしまうのです。
—
2. ベストプラクティス:BeforeUpdateでのバリデーション
「保存」のタイミングで最も重要なのが、「本当に保存して良いデータか?」をチェックするタイミングです。これを担うのがフォームの `BeforeUpdate` イベントです。
このイベントは、データがテーブルに書き込まれる「直前」に発生します。ここでチェックをかけ、不備があれば処理をキャンセルするのがプロのやり方です。
実装例:入力チェックのテンプレート
以下のコードをフォームのモジュールに貼り付けてみてください。
Private Sub Form_BeforeUpdate(Cancel As Integer)
‘ 1. 必須項目のチェック
If IsNull(Me.txt顧客名.Value) Or Me.txt顧客名.Value = “” Then
MsgBox “顧客名は必須入力です。”, vbExclamation, “入力エラー”
‘ フォーカスを戻す
Me.txt顧客名.SetFocus
‘ データの保存をキャンセルする(重要!)
Cancel = True
Exit Sub
End If
‘ 2. 論理チェック(例:日付が未来になっていないか)
If Me.txt受注日.Value > Date Then
MsgBox “未来の日付は入力できません。”, vbCritical
Cancel = True
Exit Sub
End If
‘ ここを通過すれば、Accessは自動的にテーブルへの書き込みを許可します
End Sub
—
3. なぜ `acCmdSaveRecord` を使うのか?
さて、ここで本題の `DoCmd.RunCommand acCmdSaveRecord` の登場です。
先ほどの `BeforeUpdate` が正しく実装されていれば、以下のように書くことで、安全に「保存」を確定させることができます。
Private Sub btnSave_Click()
‘ エラー処理を忘れずに
On Error GoTo Err_Handler
‘ フォームの変更を強制的に確定させる
‘ ここでBeforeUpdateが走り、チェックが働きます
If Me.Dirty Then
DoCmd.RunCommand acCmdSaveRecord
End If
MsgBox “保存が完了しました。”, vbInformation
Exit Sub
Err_Handler:
‘ ユーザーが「キャンセル」ボタンを押した時などのエラーを無視する
If Err.Number <> 2501 Then
MsgBox “予期せぬエラーです: ” & Err.Description
End If
End Sub
ここがプロの視点:`Me.Dirty` の活用
`If Me.Dirty Then` という判定を入れています。`Dirty` プロパティは「データが変更されているか(未保存か)」を教えてくれるプロパティです。変更されていないのに保存コマンドを叩くのは無駄な負荷であり、意図しないエラーを誘発する原因になります。この一行を入れるだけで、コードの品格が一段上がります。
—
4. まとめ:今日から意識すべきこと
Accessのフォーム開発をマスターするためのチェックリストを作成しました。
- 「保存」の命令を出す前に、`Me.Dirty` で変更があるか確認する。
- データの整合性チェックは、必ず `BeforeUpdate` イベントで行う。
- `Cancel = True` を使って、不正なデータの侵入を物理的に防ぐ。
これらを意識するだけで、あなたの作るAccessアプリは「動く」レベルから「堅牢で信頼できる」レベルへと進化します。
「保存」とは単なる命令ではなく、「データの正当性を保証する儀式」です。この意識を持つことが、伝説的なエンジニアへの第一歩ですよ。また分からないことがあれば、いつでも聞いてくださいね!
