Ms access 在子窗体中引用控件

Ms access 在子窗体中引用控件,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我很难确切地确定为什么下面的例子表现得如此 有效: Debug.Print表单!表格一![子表单1]!控制1 不起作用: Debug.Print表单!表格一![子窗体1]。控件1 有错误: 运行时错误“438”: 对象不支持此属性或方法 乍一看,我只是假设.control1正在访问子表单1的属性,而不是控件本身,因此有理由解释为什么会出现错误 然而,当使用这些例子时,这种推理似乎并不适用: Debug.Print表单!表格一![子表单1]。Form.control1 调试。打印表单!表格一

我很难确切地确定为什么下面的例子表现得如此

有效:

Debug.Print表单!表格一![子表单1]!控制1
不起作用:

Debug.Print表单!表格一![子窗体1]。控件1
有错误:

运行时错误“438”:
对象不支持此属性或方法


乍一看,我只是假设
.control1
正在访问
子表单1
的属性,而不是控件本身,因此有理由解释为什么会出现错误

然而,当使用这些例子时,这种推理似乎并不适用:

Debug.Print表单!表格一![子表单1]。Form.control1
调试。打印表单!表格一!子窗体1.Form.control1

结果截图:





对我来说,这些示例看起来也像是在访问
CHAT
的表单对象的a
CHAT\u MESSAGE\u ID
属性,但我没有收到错误消息,它们工作正常

为什么这两个示例仍然有效
Debug.Print表单!表格一![Subform1].control1
没有?

bang(!)操作符访问集合中的默认属性和对象。 显然,
子表单.Form
子表单
控件的默认属性,
控件
集合是
表单
类的默认属性。因此,您可以使用
子窗体访问子窗体上的控件!控制名称
。但是,如果您说
Subform.ControlName
,则特别尝试访问
子表单
控件的名为“ControlName”的属性。而这一点并不存在


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

在许多情况下,Access窗体对象允许您访问其控件并记录源字段,就像它们是窗体的属性一样。这意味着您在编辑表单中的VBA代码时可以使用Intellisense,因此您可以使用
Me.control1
Me.control1.value

这也是为什么
Debug.Print表单!表格一!子表单1.Form.control1
可以工作。但是
Debug.Print表单!表格一!Subform1.control1
失败,因为Subform1是控件,而不是表单对象,并且它不包含名为control1的属性。(这就是错误消息所抱怨的。)

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


我只是使用了一些类似于
表单的东西!表格一!子形式1!control1
,这对我来说不太容易混淆。

请看:这一行:
失败,因为子表单1是一个控件,而不是表单对象,并且它不包含名为control1的属性。
无疑是一个清晰的时刻。这也解释了为什么说
.Form
会将控件作为一个表单“强制转换”,然后它会再次“正常”运行。很好,我很难做到这一点。;-)如果是您评论的最后一部分,我想说
。Form
指的是子表单控件中包含的表单对象。该表单对象支持名为control1的属性,但子表单控件不支持。