VBA Access 中引用表单的差异

Differences in referencing forms in VBA Access

简介:

我有两个单独的表格。

  1. frmABC
  2. 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 将创建该表单的新隐藏实例。

要对此进行测试,请尝试以下操作。

  1. 创建一个名为:frm_test 的新表单,其中包含一个名为:txt_id
  2. 的文本框
  3. 转到您的即时 window 并尝试以下代码:
  4. 编辑忘了说了。测试表格必须附加一个 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. 但是,当我在这里使用 #1 并单步执行代码时,它肯定会运行代码但不会选中任何框...什么都没有。

    这是因为您的表单正在被实例化并被隐藏。

  2. 所以,我很想知道技术差异,以帮助我了解何时使用它们以及在什么情况下使用它们。

    上面给出了技术说明。 如果您的表单已经加载,您可以使用 Form!form_name / form_name 来访问它。如果您正在实例化,请使用 class 名称。