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

时间:2019-01-11 18:32:57

标签: database forms ms-access access-vba

我正在使用艾伦·布朗(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代替“ Me”并以这种方式进行操作,但它似乎不起作用。任何想法/帮助将不胜感激。或以不同方式解决此问题的想法。谢谢!

有点背景。我是VBA和Access的新手,正在使用数据库(Access Office365)进行故障报告。已预先评估所有故障,然后才交付给用户。用户将识别出故障的特定组件,并相应地填写表格(日期,故障类型等)。他们将不会更改包含预评估的表格。一切都很好并且可以正常工作。问题是在添加用户报告多个故障的功能时。

2 个答案:

答案 0 :(得分:0)

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

  

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

它们确实可以读写。它们只是不能附加到同一查询。这样做的原因是,当打开多个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

答案 1 :(得分:0)

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