Ms access VBA Access中引用表单的差异
简介: 我有两种不同的表格Ms access VBA Access中引用表单的差异,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,简介: 我有两种不同的表格 frmABC frmXYZ 我有frmABC在焦点中,我运行一个程序,在frmXYZ上“勾选”一个名为ChkConfirmed的复选框 问题: 这两种引用另一种形式的方式有什么不同 1。表单_frmXYZ.chkconfirm=True 2。形式!frmXYZ.ChkConfirmed=True 出于某种原因,只有#2在这种情况下有效。对我来说,这纯粹是令人困惑的,因为我一直使用#1,而且它以前从未抱怨过(当我说抱怨时,我的意思是它起作用了) 但是,当我在这里使用
问题: 这两种引用另一种形式的方式有什么不同 1。表单_frmXYZ.chkconfirm=True 2。形式!frmXYZ.ChkConfirmed=True
出于某种原因,只有#2在这种情况下有效。对我来说,这纯粹是令人困惑的,因为我一直使用#1,而且它以前从未抱怨过(当我说抱怨时,我的意思是它起作用了) 但是,当我在这里使用#1并逐步执行代码时,它肯定会运行代码,但不会选中任何框…什么都没有 因此,我很想知道技术上的差异,以帮助我理解何时使用每一个,以及在什么情况下使用
编辑: 实际代码段(按要求) #1版 #2版
老实说,我从来没有见过你的第一个例子被使用过,从来没有。。。事实上,Access 2010中的快速测试失败,并显示“需要对象”错误消息。我所做的所有代码都使用感叹号,这(如果我在工作,请有人纠正我)适用于需要引用其他表单的所有情况。Access(我认为>=97)将表单视为类,这意味着您的表单现在是一个类模块,可以具有所有的[Class behavior]包括实例化
表单\u您的表单名
:您正在通过类模块引用表单
表单!您的表单名称
:您通过表单名称引用表单
通过表单访问表单!表单名称
,该表单必须已加载。否则表单将无法访问,您将收到一条错误消息“未找到引用的……文件”
另一方面,Form\u Form\u name
可以作为类随时访问。它可以像所有类一样拥有多个实例。通过类模块访问未打开的表单将导致该表单被实例化。这意味着Access将创建该窗体的新隐藏实例
要测试这一点,请尝试以下操作
Form_frm_test.txt_id=1
Form_frm_test.visible=真
?表格_frm _test.hwnd
docmd.openform“frm_测试”
?表格!frm_test.hwnd
现在您将看到frm_测试表单的两个实例,每个实例都有自己的窗口句柄
回答您的问题:
也许你应该再试一次-它肯定有效。。。只是不知道为什么在这种情况下它不起作用。关于access,我学到的一件事是引用对象的方法太多了。但是Cocojay是正确的,这些确实有效。我们在这里讨论的是什么版本的Access?看看标签;-)@Gene-老实说,我从Access 2000开始使用#1方法,所以它不可能是版本问题。我100%不能复制它,我有Form1,它有一个按钮,用于更改Form2上复选框的值,两种方法都有效。您是否有任何其他OnUpdate或BEFOREPUPDATE代码可能会干扰此处?我添加了代码段,以便您可以看到@Newd。当我一步一步地浏览代码时,它不会运行我能看到的其他任何东西…除非access在幕后运行ninja code=PSo只是为了澄清,它会运行
表单!FRMAAdmin9110年终!ChkValidated=True
?你能把其他几行代码注释掉,看看是否有区别吗?在你的问题中,你说复选框的名称是chkconfirm
,但你的VBA说ChkValidated
…我总是遵循这样一条规则,如果你试图使用在表单之外编写的VBA在表单中/表单上更改某些内容(即,在单独的模块或其他模块中)然后您必须使用表单!myForm
…以便浏览对象并允许access查找您要引用的表单…根据本备忘单上的“不在这些表单上”象限:access只能将表单视为类,如果它们有(类)模块。请查看表单的HasModule属性。@PhilS抱歉,我弄错了。不确定我在想什么。@Invente Animate phil是正确的您需要一个“类模块”附加到它以使类行为非常整洁,因此基本上这意味着,如果它被实例化,那么一旦函数结束,它就会从内存中清除?不,您可以通过将hwnd保存在公共变量中来保持实例的活动状态。