Ste*_*ens 5 vba ms-access-2007
在Microsoft Access窗体中,每当当前记录更改时,绑定控件中的任何更改都会以静默方式保存到数据库表中.这很好,但是当用户关闭表单时我不希望它发生,因为它与许多人期望的完全相反.
最好的示例是当您尝试使用未保存的更改关闭excel文件时,它会询问是否应该丢弃更改.这正是我想要在Access中实现的,但是找不到任何方法来捕获VBA中的关闭按钮的事件.
表单的Unload事件是当有人单击关闭按钮时触发的第一个事件,但到那时更改已写入数据库.
这是完全可能的,还是我必须创建自己的关闭按钮?我很乐意为这样的琐碎事情编写大量代码,但我不喜欢混乱使用GUI.
你必须处理Form_BeforeUpdate事件.以下是一个例子; 但它确实会创建一个典型的警告消息:"此时您无法保存此记录.Microsoft Access在尝试保存记录时可能遇到错误...." - 取决于您的数据库设置.您可以使用下面的简单解决方法来避免显示该消息.
Private Sub Form_BeforeUpdate(Cancel As Integer)
Cancel = True
'Or even better you can check certain fields here (If Then...)
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2169 Then
Response = True
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
小智 5
肖恩给出了一个几乎正确的答案,但它留下了空白。
通常,FORMBeforeUpdate是最重要的表单事件。这是您的最后一道防线,并且始终在保存记录之前运行,无论提示保存的是什么(表单关闭,新记录,您自己的保存按钮,单击子表单等)虽然我偶尔会使用控件的BeforeUpdate事件所以用户会更快地收到错误消息,我编写的大部分验证代码都会在Form_BeforeUpdate事件中运行。如果要确保某些控件不为空,则必须使用此事件。没有任何控制级事件可以在所有情况下可靠地做到这一点。主要是因为如果控件从未获得焦点,则不会触发控件级别事件。 Form_BeforeUpdate如果您的验证涉及多个字段,这也是您将使用的事件。如果您正在使用任何其他控件或事件级事件,那么您就是在浪费时间。您的“陷阱”总是存在,并且您的表格几乎肯定包含无效数据。
关于OP的问题。如果你想强迫人们使用你自己的保存按钮并提示他们如果他们不这样做,那么你需要一个表单级别的变量,正如肖恩的建议所暗示的那样。唯一的区别是您需要将其设置为 False,在表单的 Current 事件中而不是 Open 事件中。您希望为每条新记录重置标志,而不仅仅是在表单打开时。然后在您的保存按钮单击事件中将其设置为 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
Run Code Online (Sandbox Code Playgroud)
小智 -1
实际上,您不能捕获这一点,Access 直接在表上工作,当字段因移动到另一个字段、记录或按钮而失去焦点时,每个更改都已被保存。
实际上,恕我直言,与 Excel 相比,这是一个很大的优势
如果您确实想要类似于 Excel 的行为,则需要处理表的副本和一些用于更新的代码。
| 归档时间: |
|
| 查看次数: |
27442 次 |
| 最近记录: |