VBA Access 中引用表单的差异
Differences in referencing forms in VBA Access
简介:
我有两个单独的表格。
- frmABC
- frmXYZ
我有 frmABC 焦点并且我 运行 一个程序将 "Tick" 一个名为 ChkConfirmed 的复选框在 frmXYZ.
问题:
这两种引用另一种形式的方式之间的区别是什么?
1。 Form_frmXYZ.ChkConfirmed = 正确
2。表格!frmXYZ.ChkConfirmed = True
出于某种原因,只有 #2 在这种情况下有效。对我来说,这纯粹是令人困惑,因为我一直使用 #1 并且它以前从未抱怨过(当我说抱怨时,我的意思是它完成了工作)。
但是,当我在这里使用 #1 并单步执行代码时,它肯定是 运行 代码但没有选中任何框...什么都没有.
所以,我很想知道技术差异,以帮助我了解何时使用它们以及在什么情况下使用它们。
编辑:
实际代码片段(按要求)
#1 版本
#2 版本
老实说,我从未见过您使用过第一个示例...事实上,Access 2010 中的快速测试失败并显示 "Object Required" 错误消息。我完成的所有代码都使用了感叹号,它(如果我有问题,有人会纠正我)在你需要为某些东西引用另一种形式的所有情况下都有效。
Access(我认为 >=97)将 Forms 视为 Class,这意味着您的表单现在是 class 模块,可以拥有所有 [class 行为],包括实例化。
Form_your_formname
:您正在通过 Class 模块引用表单。
Forms!your_form name
: 您正在通过表单名称引用表单。
要通过 Forms!form_name
访问表格,表格必须已经加载。否则表单将无法访问,您将收到一条错误消息 "the referenced ...... not found"
另一方面,Form_form_name
可以作为 class 随时访问。它可以像所有 classes 一样有多个实例。通过 class 模块访问 未打开的表单 将导致表单被实例化。这意味着 Access 将创建该表单的新隐藏实例。
要对此进行测试,请尝试以下操作。
- 创建一个名为:frm_test 的新表单,其中包含一个名为:txt_id
的文本框
- 转到您的即时 window 并尝试以下代码:
- 编辑忘了说了。测试表格必须附加一个 vba 模块,然后它才变成 class 模块
Form_frm_test.txt_id = 1
Form_frm_test.visible = true
?Form_frm_test.hwnd
docmd.openform "frm_test"
?Forms!frm_test.hwnd
现在您将看到 frm_test 表单的两个实例,每个实例都有自己的 window 句柄。
回答你的问题:
但是,当我在这里使用 #1 并单步执行代码时,它肯定会运行代码但不会选中任何框...什么都没有。
这是因为您的表单正在被实例化并被隐藏。
所以,我很想知道技术差异,以帮助我了解何时使用它们以及在什么情况下使用它们。
上面给出了技术说明。
如果您的表单已经加载,您可以使用 Form!form_name / form_name 来访问它。如果您正在实例化,请使用 class 名称。
简介:
我有两个单独的表格。
- frmABC
- frmXYZ
我有 frmABC 焦点并且我 运行 一个程序将 "Tick" 一个名为 ChkConfirmed 的复选框在 frmXYZ.
问题:
这两种引用另一种形式的方式之间的区别是什么?
1。 Form_frmXYZ.ChkConfirmed = 正确
2。表格!frmXYZ.ChkConfirmed = True
出于某种原因,只有 #2 在这种情况下有效。对我来说,这纯粹是令人困惑,因为我一直使用 #1 并且它以前从未抱怨过(当我说抱怨时,我的意思是它完成了工作)。
但是,当我在这里使用 #1 并单步执行代码时,它肯定是 运行 代码但没有选中任何框...什么都没有.
所以,我很想知道技术差异,以帮助我了解何时使用它们以及在什么情况下使用它们。
编辑: 实际代码片段(按要求)
#1 版本
#2 版本
老实说,我从未见过您使用过第一个示例...事实上,Access 2010 中的快速测试失败并显示 "Object Required" 错误消息。我完成的所有代码都使用了感叹号,它(如果我有问题,有人会纠正我)在你需要为某些东西引用另一种形式的所有情况下都有效。
Access(我认为 >=97)将 Forms 视为 Class,这意味着您的表单现在是 class 模块,可以拥有所有 [class 行为],包括实例化。
Form_your_formname
:您正在通过 Class 模块引用表单。
Forms!your_form name
: 您正在通过表单名称引用表单。
要通过 Forms!form_name
访问表格,表格必须已经加载。否则表单将无法访问,您将收到一条错误消息 "the referenced ...... not found"
另一方面,Form_form_name
可以作为 class 随时访问。它可以像所有 classes 一样有多个实例。通过 class 模块访问 未打开的表单 将导致表单被实例化。这意味着 Access 将创建该表单的新隐藏实例。
要对此进行测试,请尝试以下操作。
- 创建一个名为:frm_test 的新表单,其中包含一个名为:txt_id 的文本框
- 转到您的即时 window 并尝试以下代码:
- 编辑忘了说了。测试表格必须附加一个 vba 模块,然后它才变成 class 模块
Form_frm_test.txt_id = 1
Form_frm_test.visible = true
?Form_frm_test.hwnd
docmd.openform "frm_test"
?Forms!frm_test.hwnd
现在您将看到 frm_test 表单的两个实例,每个实例都有自己的 window 句柄。
回答你的问题:
但是,当我在这里使用 #1 并单步执行代码时,它肯定会运行代码但不会选中任何框...什么都没有。
这是因为您的表单正在被实例化并被隐藏。
所以,我很想知道技术差异,以帮助我了解何时使用它们以及在什么情况下使用它们。
上面给出了技术说明。 如果您的表单已经加载,您可以使用 Form!form_name / form_name 来访问它。如果您正在实例化,请使用 class 名称。