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,而且它以前从未抱怨过(当我说抱怨时,我的意思是它起作用了) 但是,当我在这里使用

简介:

我有两种不同的表格

  • frmABC
  • frmXYZ
  • 我有frmABC在焦点中,我运行一个程序,在frmXYZ上“勾选”一个名为ChkConfirmed的复选框


    问题:

    这两种引用另一种形式的方式有什么不同

    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将创建该窗体的新隐藏实例

    要测试这一点,请尝试以下操作

  • 创建一个名为:frm_test的新表单,其中包含一个名为:txt_id的文本框
  • 转到即时窗口并尝试以下代码:
  • 编辑忘记提及。测试表单必须附加一个vba模块,然后才成为类模块
  • Form_frm_test.txt_id=1
    Form_frm_test.visible=真
    ?表格_frm _test.hwnd
    docmd.openform“frm_测试”
    ?表格!frm_test.hwnd
    

    现在您将看到frm_测试表单的两个实例,每个实例都有自己的窗口句柄

    回答您的问题:

  • 但是,当我在这里使用#1并逐步执行代码时,它肯定会运行代码,但不会选中任何复选框……什么都没有

    这是因为您的窗体正在实例化,并且它是隐藏的

  • 因此,我很想知道技术上的差异,以帮助我理解何时使用每一个,以及在什么情况下使用

    上面给出的技术解释。 如果您的表单已经加载,您可以使用该表单!form_name/访问它的form_name。如果要实例化,请使用类名


  • 也许你应该再试一次-它肯定有效。。。只是不知道为什么在这种情况下它不起作用。关于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保存在公共变量中来保持实例的活动状态。