使“DoCmd.GoToRecord”功能在子窗体上工作

时间:2013-06-27 15:41:25

标签: ms-access access-vba

我一直在使用函数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是打开的。”

9 个答案:

答案 0 :(得分:10)

尝试拆分操作:

Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec

或者,您可以尝试在子窗体中创建一个公共Sub,因为它成为表单的一种方法,您可以使用它。
在最新版本的Access上使用此功能,您甚至可以尝试直接使用表单的记录集,例如Me.Recordset.Movenext

答案 1 :(得分:7)

尝试将代码放入子窗体中,然后从Parent调用它:

子表格代码:

Sub GoToNewRecord()
     DoCmd.GoToRecord , , acNewRec
End Sub

父母表格代码:

Me.sbfrm_subform.GoToNewRecord

答案 2 :(得分:4)

正如iDevlop所说,您可以使用子窗体的Recordset对象移动到新记录。但是,您不需要在子表单中创建公共子。您可以从主表单中完成所有操作:

Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew

为了使用Form_ [表单名称]语法,表单必须具有VBA代码模块。如果表单没有,并且出于某种原因,您反对创建一个空表单,那么您可以使用Forms!MyForm.SubformControl.Form语法。但Form_ [Form Name]更简单。

答案 3 :(得分:1)

我在主要表格中做了以下事件程序" On Current" :

Private Sub Form_Current()
    Me.SubformName.SetFocus
    Me.SubformName.Requery
    RunCommand acCmdRecordsGoToLast
    DoCmd.GoToRecord , , acNewRec
    Scan.SetFocus
End Sub

DoCmd用于主窗体开始新记录。之前的一切都是将子表单设置为最后一条记录并重新查询它以便数据是新鲜的。

答案 4 :(得分:0)

这就是我解决问题的方法......

主表单名称是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

由于我没有在主表单上输入任何数据,现在我的主表单打开了,重点放在子表单中的新记录上。我现在可以回到之前的记录,如果需要,但是在加载主表单时准备输入新数据。

话虽如此,您只需在“数据”选项卡“数据输入=是”下设置子表单的属性即可获得相同的结果。唯一的区别是您将无法再访问以前的记录... < / p>

答案 5 :(得分:0)

答案是使用以下行之一:

DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast

取决于您要做什么。在功能上与单击其中一个导航按钮(如果它们保持可见)相同。

如果您要从父表单中调用其中之一,则可能必须先通过以下行将焦点设置到子表单上

Me.subform_name.SetFocus

不幸的是,似乎没有一个命令可以导航到记录集中的绝对位置,这可以完成所有可能的操作。

答案 6 :(得分:0)

对我有用的是: 在显示记录的表单中,我将焦点设置在希望的字段上并设置了记录集。设置记录集后,我只需使用记录集的AddNew函数即可。

Public Sub GoToNewRecord()
   Me.<myTextbox>.SetFocus

   Dim rcClone as Recordset
   Set rcClone = Me.Recordset

   rcClone.AddNew
End Sub

答案 7 :(得分:0)

Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub

答案 8 :(得分:0)

我发现了类似的问题。使用链接表单的目的是在数据表视图中单击链接表单上的新行,并清除父表单内子表单中与链接表单同步的记录。使用DoCmd.GoToRecord,acNewRec起作用了,但是只有一次。找到的解决方案是先将焦点放在父窗体上,然后再将焦点放在子窗体上。我记得在某个地方之前找到了它-始终先将焦点放在父项上,然后再将焦点放在子项上。 ...... Carpe Dium ....