在VBA(Access)中独立地重新查询多个表单实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VBA(Access)中独立地重新查询多个表单实例相关的知识,希望对你有一定的参考价值。

我正在使用Allen Browne的精彩代码(http://allenbrowne.com/ser-35.html)在点击事件中打开表单的几个实例。我知道新实例是只读的,我设法记录用户输入的数据,以保留日志,这要归功于这篇文章(Access 2007 / VBA - Multiple Instances of Form, Update controls on specific instance from Module)。

我在每个表单上都有几个组合框,并希望更新/重新查询显示在一个表单中的内容,具体取决于用户在其他表单上的选择(对于每个表单,而不是表单之间)。例如,用户在cmb1上选择组件A,cmb2仅显示组件A的可能故障。

{me.Requery}将只和始终重新查询Forms类中的表单(从数据库窗口/导航窗格打开的表单,如果有的话,而不是下面clnClient集合上的实例)。但是,我可以使用“Me”传递信息并检索日志记录的值。

使用来自Allen Browne的略微修改的OpenAClient版本和来自MajP的输入(在这个伟大的线程中https://www.tek-tips.com/viewthread.cfm?qid=1753790

Public clnClient As New Collection

Public Function OpenAClient(FormName As String, Optional inputCaption As String = "") As Form_f_myForm
    'Purpose:   Open an independent instance of form f_myForm
    On Error GoTo Err_OpenAClient

    Dim frm As Form

    'Open a new instance, show it, and set a caption.
    Set frm = New Form_f_myForm
    frm.Visible = True
    frm.Caption = inputCaption
    frm.Tag = FormName

    'Append it to our collection.
    clnClient.Add Item:=frm, Key:=FormName

    Set OpenAClient = frm
    Set frm = Nothing
    Exit Function

Err_OpenAClient:
    If Err.Number = 457 Then
        MsgBox "A Form with this name already exists."
    Else
        MsgBox Err.Number & " " & Err.Description
    End If
End Function

我试过了

Public ActiveForm As Form_f_myform
Set activeForm = OpenAClient("ExampleForm","Example caption")

或者简单

Set activeForm = clnClient.Item(2) 'just to test the second instance

然后使用ActiveForm代替“我”并以这种方式操作它,但它似乎不起作用。任何想法/帮助将不胜感激。或者以不同的方式解决这个问题的想法。谢谢!

一点背景。我是VBA和Access的新手,在数据库(Access Office365)上进行故障报告。所有故障都已预先评估给用户。用户将识别出失败的特定组件并相应填写表单(日期,故障类型等)。他们不会更改包含预评估的表格。这一切都很好并且有效。问题在于为用户添加报告多个故障的能力。

答案

首先,让我们澄清一些误解:

我知道新实例是只读的......

它们确实可以读写。它们只是无法附加到同一个查询中。原因是当Forms!f_myform!cmb1的多个实例打开时,像f_myform这样的查询表达式不起作用。您必须为每个实例的记录源构造自定义SQL以获得真正的独立操作。

{Me.Requery}只会并且总是在Forms类中重新查询表单...

当在表单的代码中使用时,Me.Requery确实只会重新查询表单的实例。当表单的所有实例共享相同的查询时,问题就出现了。原因和解决方法如上。

至于编码策略,摆脱全球Public ActiveForm As Form_f_myform。这只是问题的一个秘诀。

表单实例本身带有您运行代码所需的一切。尝试使用表单引用本身调用函数(就像您之前所做的那样)。例如:

    Public Sub ShowComponentFailures(thisForm As Form_f_myform)
        Dim varCompID As Variant
        Dim strSQL As String
        ' get Component ID from given instance's cmb1
        varCompID = thisForm.cmb1.Value
        ' create SQL to retrieve possible failures for CompID 
        strSQL = GetComponentFailuresSQL(varCompID)
        ' set cmb2's record source to SQL
        thisForm.cmb2.RowSource = strSQL
    End Sub
另一答案

非常感谢@kismert的解决方案和提示!!我现在已经尝试过,就像你提到的那样工作。 (我必须在我的Access版本中使用.RowSource而不是.RecordSource)。

以上是关于在VBA(Access)中独立地重新查询多个表单实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 在 Access 中重新查询子表

使用 Access 在 VBA 中进行数据库设计/打开表单 CLICK EVENT:特定查询

可以通过 VBA 更改 MS Access 子表单字段吗?

MS Access中的VBA中不接受变量名称

MS ACCESS---全部通过VBA刷新

如何在 MS Access 2010 中使用 VBA 选择多值组合框的值?