5

在 Microsoft Access 窗体中,只要当前记录发生更改,绑定控件中的任何更改都会以静默方式保存到数据库表中。这很好,但我不希望在用户关闭表单时发生这种情况,因为这与许多人的期望正好相反。

最好的例子是,当您尝试关闭未保存更改的 excel 文件时,它会询问是否应丢弃更改。这正是我试图在 Access 中实现的,但找不到任何方法来捕获 VBA 中的关闭按钮事件。

表单的 Unload 事件是当有人单击关闭按钮时触发的第一个事件,但此时更改已写入数据库。

这是可能的,还是我必须创建自己的关闭按钮?我很乐意为这样的琐碎事情编写大量代码,但我讨厌不得不使 GUI 混乱。

4

6 回答 6

7

你必须处理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
于 2012-10-18T13:15:11.100 回答
6

肖恩给出了一个几乎正确的答案,但它留下了空白。

一般来说,FORM'sBeforeUpdate是最重要的表单事件。这是您的最后一道防线,并且无论什么提示保存(表单关闭、新记录、您自己的保存按钮、单击子表单等),始终在保存记录之前运行。虽然我偶尔使用该控件也是如果您的验证涉及多个字段,您将使用的事件。如果您正在使用任何其他控件或事件级别的事件,那么您就是在浪费时间。你的“陷阱”总是很远,你的表几乎肯定包含无效数据。BeforeUpdate事件因此用户会更快地收到错误消息,我编写的大部分验证代码都会在Form_BeforeUpdate事件中运行。如果要确保某些控件不为空,则必须使用此事件。在所有情况下,没有任何控制级别事件能够可靠地做到这一点。主要是因为如果控件永远不会获得焦点,则不会触发控件级别事件。 Form_BeforeUpdate

关于OP的问题。如果您想强制人们使用您自己的保存按钮并在他们不使用时提示他们,那么您需要一个表单级别的变量,正如 Sean 的建议所暗示的那样。唯一的区别是您需要在表单的 Current 事件而不是 Open 事件中将其设置为 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
于 2015-02-27T19:14:55.817 回答
2

这是我检查表单是否被关闭或保存的代码。

Private Sub Form_BeforeUpdate(Cancel As Integer)

If Not UsingSaveButton Then
    If MsgBox("Abandon Data?", vbInformation + vbYesNo) = vbNo Then
        Cancel = True
    Else
        DoCmd.RunCommand acCmdUndo
    End If
End If
End Sub

我有一个布尔标志,在加载时设置为 False,然后在使用我的保存按钮时,我将其设置为 true 以允许更新运行。
如果未设置标志,那么他们将离开记录(通过转到不同的记录或关闭表单)所以我问他们是否真的要保存更改。如果进行了任何更改,则中止表单的退出或移动到不同的记录
。 撤消任何更改,因此不会保存它们。Cancel = True
DoCmd.RunCommand acCmdUndo

于 2012-10-18T14:48:22.723 回答
0

实际上,您无法捕捉到这一点,Access 直接在表上工作,当字段通过移动到另一个字段、记录或按钮而失去焦点时,每个更改都已保存。

实际上恕我直言,与 Excel 相比,这是一个很大的优势

如果您真的想要类似于 Excel 的行为,您需要处理表格的副本和一些用于更新的代码。

于 2012-10-18T13:11:19.230 回答
0

在“On Unload”事件的表单中添加以下代码。

DoCmd.RunCommand acCmdUndo
DoCmd.Quit

当用户以任何方式关闭表单时,不再保存记录。

于 2018-03-28T10:22:53.310 回答
-1

**您可以使用此代码的退出按钮**

Private Sub Button_Click()
If Me.Dirty = True Then
   If MsgBox(" Save Change ", vbYesNo) = vbYes Then
      Me.Dirty = False
   Else
      Me.Undo
   End If
End If
DoCmd.Close acForm, "FormName"
End Sub
于 2015-12-20T17:57:33.930 回答