我一直在使用函数DoCmd.GoToRecord , , acNewRec
成功创建并移动到子窗体中的新记录(以表作为源)。但是,当我尝试从父窗体执行相同操作时,这不起作用。我尝试了不同的方法,包括:
Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec
它只关注控件(ctrName),但无法添加并转到新记录,或者
DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast
返回运行时错误2489,“对象的sbfrm_subform是打开的。”
尝试将代码放入子窗体,然后从Parent调用它:
子表格代码:
Sub GoToNewRecord()
DoCmd.GoToRecord , , acNewRec
End Sub
家长表格代码:
Me.sbfrm_subform.GoToNewRecord
尝试拆分操作:
Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec
或者,您可以尝试在子窗体中创建一个公共Sub,因为它成为表单的一种方法,您可以使用它。
在最新版本的Access上使用它,您甚至可以尝试直接使用表单的记录集,例如Me.Recordset.Movenext
。
正如iDevlop所指出的,您可以使用子窗体的Recordset对象移动到新记录。但是,您不需要在子窗体中创建公共子。您可以从主窗体中完成所有操作:
Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew
为了使用Form_ [form name]语法,表单必须具有VBA代码模块。如果表单没有,并且由于某种原因你反对创建一个空表单,那么你可以使用Forms!MyForm.SubformControl.Form语法。但Form_ [Form Name]更简单。
我在主要表单“On Current”中执行了以下事件过程:
Private Sub Form_Current()
Me.SubformName.SetFocus
Me.SubformName.Requery
RunCommand acCmdRecordsGoToLast
DoCmd.GoToRecord , , acNewRec
Scan.SetFocus
End Sub
DoCmd用于主窗体以开始新记录。之前的一切都是将子表单设置为最后一条记录并重新查询它以便数据是新鲜的。
这就是我解决问题的方法......
主表单名称是FRM_Trader_WorkSheet
子表单名称为Frm_Trader_Worksheet_Sub
在我主要表格的公开活动中,我编码如下;
Private Sub Form_Open(Cancel As Integer)
Me.Frm_Trader_Worksheet_Sub.SetFocus
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acNext
End Sub
由于我没有在我的主表单上进行任何数据输入,现在我的主表单打开,重点放在子表单中的新记录。我现在可以回到之前的记录,如果需要,但是在加载主表单时准备好输入新数据。
话虽如此,您只需在数据选项卡“数据输入=是”下设置子表单的属性即可获得相同的结果。唯一的区别是您将无法再访问以前的记录...
答案是使用以下行之一:
DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast
取决于你想做什么。这在功能上与单击其中一个导航按钮(如果它们保持可见)相同。
如果您从父窗体调用其中一个,则可能首先必须使用以下行将焦点设置到子窗体上
Me.subform_name.SetFocus
不幸的是,似乎没有一个命令导航到记录集中的绝对位置,这将完成可能性集合。
对我有用的是:在显示记录的表单中,我将焦点设置到我希望的字段并设置记录集。设置记录集后,我只使用记录集的AddNew函数。
Public Sub GoToNewRecord()
Me.<myTextbox>.SetFocus
Dim rcClone as Recordset
Set rcClone = Me.Recordset
rcClone.AddNew
End Sub
Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub