Sean はほぼ正しい答えを出しましたが、ギャップが残ります。
一般に、FORMBeforeUpdate
は最も重要なフォーム イベントです。これはあなたの最後の防御線であり、保存を促したもの (フォームを閉じる、新しいレコード、独自の保存ボタン、サブフォームをクリックするなど) に関係なく、レコードが保存される前に常に実行されますBeforeUpdate
。そのため、ユーザーはエラー メッセージをより早く受け取ることができ、私が記述した検証コードの大部分はForm_BeforeUpdate
イベントで実行されます。これは、特定のコントロールが空でないことを確認する場合に使用する必要があるイベントです。すべての状況でこれを確実に実行する制御レベル イベントはありません。主な理由は、コントロールがフォーカスされない場合、コントロール レベル イベントが発生しないためです。 Form_BeforeUpdate
検証に複数のフィールドが含まれる場合に使用するイベントでもあります。他のコントロールまたはイベント レベルのイベントを使用している場合は、時間を無駄にしています。「トラップ」の周りには常に離れており、テーブルにはほぼ確実に無効なデータが含まれています。
OPの質問について。人々に独自の保存ボタンを使用させ、そうでない場合はプロンプトを表示させたい場合は、ショーンの提案が暗示しているように、フォームレベル変数が必要です。唯一の違いは、Open イベントではなく、フォームの Current イベントで False に設定する必要があることです。フォームが開いたときだけでなく、新しいレコードごとにフラグをリセットする必要があります。次に、レコードを強制的に保存する直前に、保存ボタンのクリック イベントで True に設定しますDoCmd.RunCommand acCmdSaveRecord
。
最後に、Form_BeforeUpdate
イベントで変数の値を確認します。
If bClose = False Then
If MsgBox("Do you want to save the changes?", vbYesNo) = vbNo Then
Cancel = True
If MsgBox("Do you want to discard the Changes?", vbYesNo) = vbYes Then
Me.Undo
End If
Exit Sub
End If
End If