访问VBA:关闭表单会导致表

时间:2018-03-10 09:35:40

标签: vba access-vba

让我解释一下我设置的内容,以便轻松描述我的问题。我基于一个表创建了一个子表单,为了说明,我看起来像这个样本:

enter image description here

每个Text Box都有界限,即其Control Source指向表格中相应的字段名称。

底部有一个保存Command Button,我添加了一些vba代码,将4个字段值插入到表格中。

单击保存按钮后,我会执行以下操作以插入表格,然后关闭表单:

db.Execute "INSERT INTO testTable (Number, Name, OtherNumber, OtherName) " _
        & "VALUES (" & Me.Number & ", '" & Me.Name _ 
        & Me.OtherNumber & "', '" & Me.OtherName & "')"
DoCmd.Close acForm, "frmTest", acSaveNo

问题是,一旦表单关闭,它就会在表格中创建一个重复的条目。

由于我目前对vba编程不熟悉,我知道它与表格中的有界文本框有关,因为如果我从文本框中删除Control Source字段,将其留空,并手动获取相反,文本框中的值,即Me.textBox_OtherNumber,然后在单击保存按钮时将这些值插入表中,当表单关闭时,我不会在表中获得重复的条目。

但是,我希望将文本框绑定到表格,因为这样可以更轻松地在acFormAdd模式下打开表单,其中字段值为空并等待已添加为记录,或者表单以acFormEdit模式打开,其中字段值已使用WHERE填充表格中所选行的值DoCmd.OpenForm中的criteria子句参数。

例如,我的父表单包含Command Buttonsubform。子表单的Source Object链接到DatasheetRecord Source与子表单链接到同一个表。

OtherNumber的{​​{1}}字段中,我创建了一个Datasheet并将其hyperlink命令编程为:

On Click

当点击特定行的特定Dim uniqID As Integer Dim criteria As String uniqID = Me.ID criteria = "ID = " & uniqID DoCmd.OpenForm "frmTest", acNormal, , criteria, acFormEdit 时,hyperlink中的字段会填充基于frmTest的数据,该数据将用于更新< / strong>当前记录。

但是,如果在父表单中单击criteria,我会执行以下操作:

Command Button

表单已打开,但字段值为空,表示即将根据字段值添加新记录。

对我而言,这感觉就像没有DoCmd.OpenForm "frmTest", acNormal, , , acFormAdd 中的文本框更容易受到任何限制,如果没有限制,我必须找出一种方法来引用字段值。 frmTest并传递给子表单Datasheet

你看到我的困境吗?什么是解决这个问题的最佳方法?

由于

1 个答案:

答案 0 :(得分:2)

有许多方法可以解决这个问题:

使用绑定表单,在保存按钮上,只省略保存记录的行(因为Access会自动保存它):

DoCmd.Close acForm, Me.Name, acSaveNo

或者,如果您不信任Access保存它:

Me.Recordset.Update
'Or: DoCmd.RunCommand acCmdSaveRecord
'Or: If Me.Dirty Then Me.Dirty = False
DoCmd.Close acForm, Me.Name, acSaveNo

请注意,acSaveNo表示不保存对表单 design 的任何更改,并且与以任何方式保存记录无关。

如果要在未绑定表单上设置其他表单的值:

If Not Application.SysCmd(acSysCmdGetObjectState, acForm, "frmTest") Then 
    'You probably don't want to run this if the form is already opened
    DoCmd.OpenForm "frmTest"
    frmTest!ID.Value = uniqID
End If

(当然,也有很多替代方案。最相关的是你可以使用OpenArgs的{​​{1}}参数在表单之间传递参数,你可以在表单加载时处理这些参数)。