在子表单中引用控件

Referencing Controls in Subforms

我无法准确确定以下示例的行为方式的原因。

作品:

Debug.Print Forms!Form1![Subform1]!control1 

无效:

Debug.Print Forms!Form1![Subform1].control1 

有错误:

Run-time error '438':
Object doesn't support this property or method


乍一看,我只是假设 .control1 正在访问 Subform1 的 属性 而不是控件本身,所以会出现错误是有道理的。

然而,当将这些用于示例时,推理似乎并不适用:

Debug.Print Forms!Form1![Subform1].Form.control1 
Debug.Print Forms!Form1!Subform1.Form.control1


结果截图:





对我来说,这些示例看起来也像是我正在访问 Chat 表单对象的 .CHAT_MESSAGE_ID 属性,但我没有收到任何错误消息,它们工作正常。

为什么这两个示例有效而 Debug.Print Forms!Form1![Subform1].control1 却无效?

bang (!) 运算符访问集合中的默认属性和对象。 显然Subform.FormSubform控件的默认属性,Controls集合是Formclass默认的属性 .因此,您可以使用 Subform!ControlName 访问子表单上的控件。但是,如果您说 Subform.ControlName,则您专门尝试访问 Subform 控件的名为 "ControlName" 的 属性。而那个并不存在。

银行 (!) 运算符搜索匹配对象。点 (.) 运算符假定直接引用现有的 属性。

在许多情况下,Access 表单对象 允许您访问其控件和记录源字段,就好像它们是表单的 属性 .这意味着您可以在该表单中编辑 VBA 代码时使用 Intellisense,因此您可以使用 Me.control1control1 引用名为Me.control1.Value

该功能也是 Debug.Print Forms!Form1!Subform1.Form.control1 可以 工作的原因。但是 Debug.Print Forms!Form1!Subform1.control1 失败,因为 Subform1 是一个控件,而不是 form 对象 ,并且它不包含一个 属性 命名control1。 (这就是错误消息所抱怨的。)

如果您的子表单的 SourceObject 是 table 或查询而不是实际的表单对象,情况会变得更加复杂。我自己还没有研究过这些变体的细节,但如果你真的想使用 SubformControl.Form.property 模式,我建议你研究一下它们。

我只是使用类似 Forms!Form1!Subform1!control1 的东西,这对我来说不那么令人困惑。