使“DoCmd.GoToRecord”函数在子窗体上工作
Posted
技术标签:
【中文标题】使“DoCmd.GoToRecord”函数在子窗体上工作【英文标题】:Making "DoCmd.GoToRecord" function work on a subform 【发布时间】:2013-06-27 15:41:25 【问题描述】:我一直在使用函数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 未打开。”
【问题讨论】:
【参考方案1】:尝试拆分操作:
Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec
或者,您可以尝试在子表单中创建一个公共 Sub,因为它成为表单的一种方法,您可以使用它。
在最新版本的 Access 上使用它,您甚至可以尝试直接使用表单的记录集,例如 Me.Recordset.Movenext
。
【讨论】:
使用表单记录集而不是 DoCmd.GoToRecord 对我有用。得到相同的“表单未打开错误”。我最终使用了 Recordset.FindFirst 方法。谢谢!【参考方案2】:尝试将代码放入子窗体中,然后从父窗体中调用它:
子表单代码:
Sub GoToNewRecord()
DoCmd.GoToRecord , , acNewRec
End Sub
父表单代码:
Me.sbfrm_subform.GoToNewRecord
【讨论】:
这看起来是一个非常优雅的解决方案,但我无法让它发挥作用。我专门去子表单代码,把 Sub GotoNewRecord() 放在那里,然后尝试从主表单(我)访问它。它不识别子,并给出编译错误(预期:=)。我也将 sub 设为 Public,但没有帮助。我很好奇我做错了什么。 抱歉。括号可能是搞砸了。 :-(【参考方案3】:正如 iDevlop 所指出的,您可以使用子表单的 Recordset 对象移动到新记录。但是,您不需要在子表单中创建公共子。您可以从主窗体中完成所有操作:
Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew
为了使用 Form_[form name] 语法,表单必须有一个 VBA 代码模块。如果表单没有,并且出于某种原因您反对创建一个空表单,那么您可以使用 Forms!MyForm.SubformControl.Form 语法。但是 Form_[Form Name] 更简单。
【讨论】:
【参考方案4】:我在主窗体“On Current”中执行了以下事件过程:
Private Sub Form_Current()
Me.SubformName.SetFocus
Me.SubformName.Requery
RunCommand acCmdRecordsGoToLast
DoCmd.GoToRecord , , acNewRec
Scan.SetFocus
End Sub
DoCmd 用于主窗体开始新记录。在此之前的一切都是将子表单设置为最后一条记录并重新查询它,以便数据是新鲜的。
【讨论】:
【参考方案5】:这就是我解决问题的方法...
主窗体名称是 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
由于我没有在我的主窗体上输入任何数据,现在我的主窗体打开,重点是我的子窗体中的新记录。如果需要,我现在可以返回以前的记录,但我已准备好在加载主表单时输入新数据。
话虽如此,您只需在“数据”选项卡下设置子表单的属性“数据条目 = YES”即可获得相同的结果。唯一的区别是您将无法再访问以前的记录...
【讨论】:
【参考方案6】:答案是使用以下行之一:
DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast
取决于你想做什么。这在功能上与单击其中一个导航按钮(如果它们保持可见)相同。
如果您从父窗体调用其中之一,您可能首先必须使用以下行将焦点设置到子窗体上
Me.subform_name.SetFocus
不幸的是,似乎没有一个命令可以导航到记录集中的绝对位置,这将完成这组可能性。
【讨论】:
【参考方案7】:对我有用的是: 在显示记录的表单中,我将焦点设置到我希望的字段并设置记录集。设置记录集后,我只使用记录集的 AddNew 函数。
Public Sub GoToNewRecord()
Me.<myTextbox>.SetFocus
Dim rcClone as Recordset
Set rcClone = Me.Recordset
rcClone.AddNew
End Sub
【讨论】:
【参考方案8】:Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub
【讨论】:
请添加一些 cmets 以便声明您在做什么。 尝试在您的代码中添加一些描述。为什么是工作?你的代码是做什么的?【参考方案9】:我发现了一个类似的问题(我认为)。使用链接表单的目的是在数据表视图中单击链接表单上的新行,并清除链接表单在父表单中的子表单中与之同步的记录。使用 DoCmd.GoToRecord , , acNewRec 工作但只有一次。找到的解决方案是先将焦点放在父表单上,然后再将焦点放在子表单上。我记得之前在某个地方找到过这个——总是先把焦点放在父级上,然后是子级。 ...... Carpe Dium ....
【讨论】:
以上是关于使“DoCmd.GoToRecord”函数在子窗体上工作的主要内容,如果未能解决你的问题,请参考以下文章