尝试使用基于子表单控件的 DoCmd.OpenForm 打开表单
Posted
技术标签:
【中文标题】尝试使用基于子表单控件的 DoCmd.OpenForm 打开表单【英文标题】:Trying to open a form using DoCmd.OpenForm based on sub form control 【发布时间】:2016-02-05 17:49:28 【问题描述】:我有一个带有未绑定控件 (Text0) 的未绑定表单。在 Text0 中,我输入一个 RefNo。我想打开另一个表单 (frmDisclosure),它有一个包含 RefNo 的子表单 (frmRefNosList)。我打开 frmDisclosure 的代码是: 私有子 Command8_Click()
Dim Refce As Variant
DoCmd.OpenForm "frmDisclosure"
Forms!frmDisclosure.FilterOn = False
Refce = "Forms!frmDisclosure!frmRefNosList.Form!RefNo"
DoCmd.OpenForm "frmDisclosure", acNormal, "", Refce & " = " & Me.Text0, , acNormal
End Sub
【问题讨论】:
这没有意义。您打开 frmDisclosure 两次,第二次应用了无意义的过滤器。 这很有意义,这可能是显而易见的。表单披露通常使用过滤器打开,在我使用的其他代码中,必须将其删除。“打开两次”在其他代码中有效。看来我的“参考”有问题。删除过滤器,我收到一条消息,提示找不到 frm Disclosure。 控件名称相同。 实际上 Gustav,我正在应用 Where 条件,而不是过滤器。因此有必要删除始终存在的过滤器并使用 Where 条件打开表单。 HansUp:看看这个:Debug.Print Forms!frmDisclosure!frmRefNosList!RefNo, TypeName(Forms!frmDisclosure!frmRefNosList!RefNo) F0105228509 文本框。 Ref No 与表单打开时通常出现的记录有关 - 我不知道为什么。 【参考方案1】:在我们在聊天中讨论之后,我模拟了一些希望看起来像你想要做的事情:
Link to Access file mock-up.
对于稍后可能会阅读本文的其他人,这里有一些说明:
表单 Form1 上有一个名为 Text0 的文本框和一个按钮。 按下按钮时应该打开 Form2 子窗体就可以了。 Form2 然后应该打开到某个记录,然后过滤 子窗体上显示的记录全部使用 Text0 中提供的值这是我的 Form1 模型的样子:
所以当我提供 RefNo 并单击按钮时...
...在该按钮的单击事件上运行以下代码(带注释):
Private Sub cmdOpen_Click()
' check user has provided a RefNo in the textbox...
If _
Me.Text0 = "" Or _
IsNull(Me.Text0) _
Then
' ...if a RefNo has not been provided, give an error message
MsgBox "Please provide a Ref No.", vbExclamation Or vbOKOnly, "Disclosure Search"
Else
' ...if a RefNo has been provided, look in the table that lists an applicant's
' forms and return the ApplicantID (or equivalent field you're using) for the RefNo provided
Dim varApplicantID As Variant
varApplicantID = DLookup("ApplicantID", "tblRefNos", "RefNo=" & Me.Text0)
' ...check that an applicant record can be actually be found from the RefNo provided
If _
IsNull(varApplicantID) _
Then
'... if an applicant record is not found, give an error message
MsgBox "Could not find an applicant with the RefNo provided.", vbExclamation Or vbOKOnly, "Disclosure Search"
Else
'... if an applicant record is found, open Form2 to that applicant's record
DoCmd.OpenForm "Form2", , , "ApplicantID=" & varApplicantID
'... and then filter the subform on Form2 by the RefNo provided
Forms!Form2!frmApplicantForms_sub.Form.Filter = "RefNo=" & Me.Text0
Forms!Form2!frmApplicantForms_sub.Form.FilterOn = True
Forms!Form2!frmApplicantForms_sub.Form.Requery
End If
End If
End Sub
这将导致 Form2 打开从提供的 RefNo 派生的正确申请人记录,并通过提供的 RefNo 过滤子表单:
您的确切项目布局可能与我所模拟的有所不同,因此可能需要针对您的设置进行一些调整,但希望我在这里说明的原则能够很容易翻译。
祝你好运!
【讨论】:
非常感谢。稍后我会看看它是如何工作的。【参考方案2】:这不是我想要的答案,而是:我创建了一个查询,该查询产生了对应于未绑定表单上 Text0 的 frmDisclosure 的 ID 号。然后,我使用 DLookup 从未绑定的表单中检索该 ID 号,并以这种方式打开 frmDisclosure。在未绑定的表单中完成所有操作会更好。
【讨论】:
你想要的很可能是可能的,但你可能必须更清楚你想要做什么。到目前为止,我认为您已经说过您有带有 Text0 的 Form1,并且您想在 Text0 中放置一个 refno,按下一个按钮(?)并打开 Form2,它有一个子表单,其中包含应该(?)包含一个 refno你已经放入 Text0(?) 此外,参数“Refce = Me.Text0”是一个 WHERE 子句,与您正在打开的表单相关,因此“Refce”应该是您的 frmDisclosure 表单上的一个字段。是吗?这很令人困惑,因为您还在 VBA 中将Refce
定义为变量 [续...]
[...] WHERE 子句参数应该用双引号括住对您正在打开的表单上的字段的引用,然后连接该表单上没有的任何其他内容,例如:"Refce = " & Me.Text0
(我已经假设这是一个数字字段;如果是文本,则需要以不同的方式书写)。我还认为您分配Refce = Forms!frmDisclosure.frmRefNosList!RefNo
的位置应该更像Refce = Forms!frmDisclosure!frmRefNosList.Form!RefNo
(请参阅这个方便的指南:access.mvps.org/access/forms/frm0031.htm)。
谢谢马特·霍尔。我在上面编辑了我的问题。我有带有 Text0 的 Form1,我在 Text0 中放置了一个 RefNo,按下一个按钮(Command8)并希望它打开 Form2,它有一个子表单,其中包含一个包含我在 Text0 中的 RefNo 的列表。 'Refce = Me.Text0' 是与我要打开的表单相关的 WHERE 子句。 “Refce”相当于我的 frmDisclosure 表单上的一个字段 (RefNo)。我现在得到的是 Form2 打开但有一个窗口'输入参数值 F01056106。 Blwo 我应该在其中输入参数值的“控件”。如果我插入该数据,Form2 将以添加模式打开。
哦,好吧,你的 RefNo 不是一个数字,它是一个字符串,因为那个“F”。您必须像这样进行 DLookup:varApplicantID = DLookup("ApplicantID", "tblRefNos", "RefNo='" & Me.Text0 & "'")
(请注意需要在 Me.Text0
周围包含单引号,以告诉它 Text0 具有字符串值而不是数字)。
我的答案左上角应该是一个空的勾号。单击该按钮将其变为绿色并接受答案:i.stack.imgur.com/QpogP.png以上是关于尝试使用基于子表单控件的 DoCmd.OpenForm 打开表单的主要内容,如果未能解决你的问题,请参考以下文章
是否可以为特定记录禁用/启用访问子表单中的控件?访问 2000 - VBA